Middle
Proč lze prázdné rozhraní v Go převést na jakýkoli typ?
sobes.tech AI
Odpověď od AI
Prázdné rozhraní interface{} neobsahuje žádné metody. Jakýkoli typ v Go může splnit rozhraní, které nevyžaduje žádné metody. Proto lze hodnotu jakéhokoli typu přiřadit proměnné typu interface{} nebo ji předat funkci, která přijímá interface{}. V podstatě je interface{} kontejnerem pro hodnotu jakéhokoli typu, který uchovává jak hodnotu, tak její typ.
package main
import "fmt"
func main() {
var i interface{} // Deklarujeme proměnnou prázdného rozhraní
i = 42 // Přiřadíme int
fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)
i = "ahoj" // Přiřadíme string
fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)
i = true // Přiřadíme bool
fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)
i = struct{}{} // Přiřadíme prázdnou strukturu
fmt.Printf("Hodnota: %v, Typ: %T\n", i, i)
}
Převod z interface{} na konkrétní typ je možný pomocí tvrzení o typu (type assertion) nebo pomocí switch o typu (type switch).
package main
import "fmt"
func main() {
var i interface{} = "svět"
// Tvrzení o typu
s, ok := i.(string) // kontrola, zda je hodnota string
if ok {
fmt.Println("Úspěšné tvrzení o typu:", s)
} else {
fmt.Println("Tvrzení o typu selhalo")
}
// Switch o typu
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ámý typ")
}
}