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