Sobes.tech
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")
	}
}