Sobes.tech
Middle

Miért lehet a Go nyelvben az üres interfészt bármilyen típusra konvertálni?

sobes.tech MI

Válasz az MI-től

Üres interfész interface{} nem tartalmaz metódusokat. Bármilyen típus Go-ban kielégítheti a metódusokat nem igénylő interfészt. Ezért bármilyen típus értéke hozzárendelhető az interface{} típusú változóhoz vagy átadható olyan függvénynek, amely elfogadja az interface{}-t. Lényegében az interface{} egy tároló minden típus értékéhez, amely tárolja magát az értéket és annak típusát.

package main

import "fmt"

func main() {
	var i interface{} // Üres interfész változó deklarálása

	i = 42            // int érték hozzárendelése
	fmt.Printf("Érték: %v, Típus: %T\n", i, i)

	i = "szia"      // string érték hozzárendelése
	fmt.Printf("Érték: %v, Típus: %T\n", i, i)

	i = true        // bool érték hozzárendelése
	fmt.Printf("Érték: %v, Típus: %T\n", i, i)

	i = struct{}{}  // üres struktúra hozzárendelése
	fmt.Printf("Érték: %v, Típus: %T\n", i, i)
}

Az interface{}-ből konkrét típusra való átalakítás típus-állítással (type assertion) vagy típusváltással (type switch) lehetséges.

package main

import "fmt"

func main() {
	var i interface{} = "világ"

	// Típus-állítás
	s, ok := i.(string) // ellenőrzi, hogy az érték string-e
	if ok {
		fmt.Println("Típus-állítás sikeres:", s)
	} else {
		fmt.Println("Típus-állítás sikertelen")
}

	// Típusváltás
	switch v := i.(type) {
	case int:
		fmt.Println("Típus: int, érték:", v)
	case string:
		fmt.Println("Típus: string, érték:", v)
	default:
		fmt.Println("Ismeretlen típus")
	}
}