Maison > Article > développement back-end > Pourquoi est-ce que j'obtiens l'erreur « Impossible de saisir le commutateur sur une valeur non-interface » dans Golang ?
Erreur : "Impossible de saisir le commutateur sur une valeur non-interface" dans Golang
Lorsque vous travaillez avec des assertions de type, vous pouvez rencontrer l'erreur " Je ne peux pas taper sur une valeur non-interface." Cela se produit lorsque vous tentez d'effectuer un changement de type sur une valeur qui n'est pas une interface.
Dans Golang, le changement de type vous permet d'exécuter du code de manière conditionnelle en fonction du type d'une variable. Cependant, cela nécessite que la variable soit de type interface. Une interface représente un contrat qui définit un ensemble de méthodes qu'un type d'implémentation doit implémenter.
Dans l'extrait de code fourni, un type nommé Stringer est défini avec une seule méthode String(). Le type Number implémente également la méthode String(), ce qui en fait une implémentation concrète de l'interface Stringer.
type Stringer interface { String() string } type Number struct { v int } func (number *Number) String() string { return strconv.Itoa(number.v) }
Cependant, l'erreur se produit dans la fonction principale, où un changement de type est tenté sur la variable n. , qui est de type *Number plutôt que Stringer.
func main() { n := &Number{1} switch v := n.(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
Pour résoudre ce problème, vous devez convertir n en interface{} avant d'effectuer l'assertion de type. En effet, interface{} peut représenter n'importe quelle valeur arbitraire.
func main() { n := &Number{1} switch v := interface{}(n).(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
En convertissant n en interface{}, vous autorisez essentiellement le commutateur de type à considérer la possibilité que n soit de type Stringer. Une fois le commutateur de type entré, le type réel de n peut être déterminé et la branche de cas appropriée exécutée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!