Maison > Article > développement back-end > Pourquoi une instance nulle d'une structure qui satisfait l'interface d'erreur n'est-elle pas comparable à zéro ?
Puzzle de comparaison d'interface Nil Nil
Malgré la satisfaction de l'interface d'erreur, une structure avec une instance nil ne se comporte pas comme prévu par rapport à nil.
Question :
Pourquoi le code suivant ne génère-t-il pas "L'erreur est nulle" ?
<code class="go">type Goof struct {} func (goof *Goof) Error() string { return fmt.Sprintf("I'm a goof") } func TestError(err error) { if err == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } } func main() { var g *Goof // nil TestError(g) // expect "Error is not nil" }</code>
Réponse :
Dans Go, les comparaisons d'interface prennent en compte à la fois le type et la valeur. Alors que le type Goof implémente l'interface error, une instance nil de Goof (*Goof)(nil) a un type distinct de erreur (nil).
Solution :
Pour résoudre ce problème, vous pouvez adopter l'une des approches suivantes :
Pour plus de détails, reportez-vous à la réponse étendue ci-dessous :
Réponse étendue :
Les valeurs d'interface se composent de deux composants : un type et un valeur dynamique. Une valeur d'interface nil contient à la fois un type nil et une valeur nil. Dans notre cas, (*Goof)(nil) a un type non-nil (Goof), mais une valeur nil.
De plus, l'opérateur d'égalité de Go (==) vérifie strictement l'identité du type. Par conséquent, comparer (*Goof)(nil) à error(nil) échoue car ils sont de types différents.
Ce comportement est cohérent avec d'autres vérifications de type dans Go. Par exemple, dans le code suivant, les données sous-jacentes sont les mêmes (3), mais les variables ont des types différents, ce qui entraîne une inégalité lorsqu'elles sont stockées dans les interfaces :
<code class="go">var x int = 3 var y Bob = 3 var ix, iy interface{} = x, y fmt.Println(ix == iy) // false</code>
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!