Middle
Perché l'interfaccia vuota in Go può essere convertita in qualsiasi tipo?
sobes.tech AI
Risposta dell'AI
L'interfaccia vuota interface{} non contiene metodi. Qualsiasi tipo in Go può soddisfare un'interfaccia che non richiede metodi. Pertanto, il valore di qualsiasi tipo può essere assegnato a una variabile di tipo interface{} o passato a una funzione che accetta interface{}. In sostanza, interface{} è un contenitore per un valore di qualsiasi tipo, che memorizza sia il valore stesso che il suo tipo.
package main
import "fmt"
func main() {
var i interface{} // Dichiarazione di una variabile di interfaccia vuota
i = 42 // Assegna un int
fmt.Printf("Valore: %v, Tipo: %T\n", i, i)
i = "ciao" // Assegna un string
fmt.Printf("Valore: %v, Tipo: %T\n", i, i)
i = true // Assegna un bool
fmt.Printf("Valore: %v, Tipo: %T\n", i, i)
i = struct{}{} // Assegna una struttura vuota
fmt.Printf("Valore: %v, Tipo: %T\n", i, i)
}
La conversione a un tipo specifico da interface{} è possibile tramite asserzione di tipo (type assertion) o switch di tipo (type switch).
package main
import "fmt"
func main() {
var i interface{} = "mondo"
// Asserzione di tipo
s, ok := i.(string) // verifica se il valore è una stringa
if ok {
fmt.Println("Asserzione di tipo riuscita:", s)
} else {
fmt.Println("Asserzione di tipo fallita")
}
// Switch di tipo
switch v := i.(type) {
case int:
fmt.Println("Il tipo è int, valore:", v)
case string:
fmt.Println("Il tipo è string, valore:", v)
default:
fmt.Println("Tipo sconosciuto")
}
}