Tracce
/
Go
Go
/
Programma
/
Type assertion
Ty

Type assertion in Go

1 esercizio

Informazioni su Type assertion

Le interfacce in Go possono introdurre ambiguità riguardo al tipo sottostante. Anzi, l'interfaccia vuota può assumere qualsiasi valore concreto (compresi i tipi primitivi). Una type assertion ci permette di estrarre il valore concreto sottostante da un valore di interfaccia usando questa sintassi: interfaceVariable.(concreteType).

Se assegniamo il risultato di questa istruzione a un singolo valore, affermiamo che la variabile di interfaccia contiene un valore del tipo concreto. Di conseguenza, a runtime può andare in panic se il valore dell'interfaccia non ha il tipo concreto specificato. Per esempio:

var input interface{} = 12
str := input.(string) // panic at runtime since input is not a string!

Possiamo verificare se un valore di interfaccia contiene un tipo concreto specifico sfruttando entrambi i valori restituiti dalla type assertion: il valore sottostante e un valore booleano che indica se la type assertion è riuscita. Per esempio:

str, ok := input.(string) // no panic if input is not a string

Se input contiene una string, allora str sarà il valore sottostante e ok sarà true. Se input non contiene una string, allora str sarà il valore zero del tipo string (cioè "", la stringa vuota) e ok sarà false. In nessuno dei due casi si verifica un panic.

È comune incontrare questo tipo di schema:

str, ok := input.(string)
if !ok {
    str = "a default value"
}

Type switch

Un type switch può eseguire diverse type assertion di seguito. Ha la stessa sintassi di una type assertion (interfaceVariable.(concreteType)), ma al posto di un concreteType specifico usa la parola chiave type. Ecco un esempio:

var i interface{} = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}

switch v := i.(type) {
case int:
    fmt.Printf("the integer %d\n", v)
case string:
    fmt.Printf("the string %s\n", v)
default:
    fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}
Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Type assertion