Sobes.tech
Middle

Prečo je prázdne rozhranie v Go možné previesť na akýkoľvek typ?

sobes.tech AI

Odpoveď od AI

Prázdne rozhranie interface{} neobsahuje žiadne metódy. Akýkoľvek typ v Go môže spĺňať rozhranie, ktoré nevyžaduje žiadne metódy. Preto hodnotu akéhokoľvek typu možno priradiť premennej typu interface{} alebo ju odovzdať funkcii, ktorá prijíma interface{}. V podstate je interface{} kontajnerom pre hodnotu akéhokoľvek typu, ktorý uchováva ako hodnotu, tak jej typ.

package main

import "fmt"

func main() {
	var i interface{} // Deklarujeme premennú prázdneho rozhrania

	i = 42            // Priradíme int
	fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)

	i = "ahoj"      // Priradíme string
	fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)

	i = true        // Priradíme bool
	fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)

	i = struct{}{}  // Priradíme prázdnu štruktúru
	fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)
}

Prevod z interface{} na konkrétny typ je možný pomocou tvrdenia o type (type assertion) alebo switcha o type (type switch).

package main

import "fmt"

func main() {
	var i interface{} = "svet"

	// Tvrdenie o type
	s, ok := i.(string) // kontroluje, či je hodnota string
	if ok {
		fmt.Println("Úspešné tvrdenie o type:", s)
	} else {
		fmt.Println("Neúspešné tvrdenie o type")
}

	// Switch o type
	switch v := i.(type) {
	case int:
		fmt.Println("Typ je int, hodnota:", v)
	case string:
		fmt.Println("Typ je string, hodnota:", v)
	default:
		fmt.Println("Neznámy typ")
	}
}