Comparaison des instances d'interface nulles
Considérez le code ci-dessous :
<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) // Displays "Error is not nil" }</code>
Étonnamment, ce code donne " L'erreur n'est pas nulle", malgré l'intention de tester la condition nulle.
La clé pour comprendre ce comportement réside dans la façon dont Go implémente les interfaces. En interne, les valeurs d'interface se composent d'un type et d'une valeur. Bien que la valeur puisse être nulle, le type n’est jamais nul. Dans l'exemple donné, (*Goof)(nil) est une valeur d'interface avec le type "*Goof" et la valeur nil.
Cependant, le type d'interface d'erreur est distinct du type "*Goof". Par conséquent, (*Goof)(nil) et error(nil) ne sont pas égaux, même s’ils contiennent tous deux des valeurs nulles. Cela ressort clairement du code suivant :
<code class="go">var g *Goof // nil var e error = g if e == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } // Output: Error is not nil</code>
Pour résoudre ce problème, il existe plusieurs approches :
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!