Assertion de type dans Go : résolution de l'erreur « Impossible de saisir le commutateur sur une valeur non-interface »
Lorsque vous travaillez avec des assertions de type dans Go, il est possible de rencontrer l'erreur "Impossible de taper sur une valeur non-interface". Voyons ce que cela signifie et comment le résoudre, avec un exemple utilisant un type personnalisé.
Considérez l'extrait de code suivant :
package main import "fmt" import "strconv" type Stringer interface { String() string } type Number struct { v int } func (number *Number) String() string { return strconv.Itoa(number.v) } func main() { n := &Number{1} switch v := n.(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
Lorsque vous exécutez ce code, vous rencontrez l’erreur « Impossible de taper sur une valeur non-interface ». Cela indique que l'assertion de type est effectuée sur une valeur non-interface. Dans ce cas, n est un pointeur vers une structure Number, qui n'est pas une interface.
La solution consiste à convertir la valeur en une interface{} avant de tenter l'assertion de type. En effet, les assertions de type ne peuvent être effectuées que sur les valeurs d'interface. Voici le code corrigé :
func main() { n := &Number{1} switch v := interface{}(n).(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
Maintenant, lorsque vous exécutez le code, il affichera "Stringer : 1". En effet, la conversion de n en interface{} lui permet d'être traité comme une valeur d'interface pour l'assertion de type.
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!