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")
}
}