Sobes.tech
Middle

Dlaczego pusta interfejs w Go można przypisać do dowolnego typu?

sobes.tech AI

Odpowiedź od AI

Pusta interfejs interface{} nie zawiera metod. Dowolny typ w Go może spełniać interfejs, który nie wymaga żadnych metod. Dlatego wartość dowolnego typu można przypisać do zmiennej typu interface{} lub przekazać do funkcji przyjmującej interface{}. W istocie, interface{} jest kontenerem dla wartości dowolnego typu, przechowując zarówno samą wartość, jak i jej typ.

package main

import "fmt"

func main() {
	var i interface{} // Deklarujemy zmienną pustego interfejsu

	i = 42            // Przypisujemy int
	fmt.Printf("Wartość: %v, Typ: %T\n", i, i)

	i = "cześć"     // Przypisujemy string
	fmt.Printf("Wartość: %v, Typ: %T\n", i, i)

	i = true        // Przypisujemy bool
	fmt.Printf("Wartość: %v, Typ: %T\n", i, i)

	i = struct{}{}  // Przypisujemy pustą strukturę
	fmt.Printf("Wartość: %v, Typ: %T\n", i, i)
}

Konwersja z interface{} na konkretny typ jest możliwa za pomocą asercji typu (type assertion) lub switcha typu (type switch).

package main

import "fmt"

func main() {
	var i interface{} = "świat"

	// Asercja typu
	s, ok := i.(string) // sprawdza, czy wartość jest stringiem
	if ok {
		fmt.Println("Udana asercja typu:", s)
	} else {
		fmt.Println("Nieudana asercja typu")
	}

	// Switch typu
	switch v := i.(type) {
	case int:
		fmt.Println("Typ to int, wartość:", v)
	case string:
		fmt.Println("Typ to string, wartość:", v)
	default:
		fmt.Println("Nieznany typ")
	}
}