Maison  >  Article  >  développement back-end  >  Pourquoi la valeur d'interface « nil » n'est-elle pas égale à « erreur (nil) » dans Go ?

Pourquoi la valeur d'interface « nil » n'est-elle pas égale à « erreur (nil) » dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-30 18:45:30615parcourir

Why Does `nil` Interface Value Not Equal `error(nil)` in Go?

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 :

  1. Déclarez l'erreur var err au lieu de var g *Goof, comme zéro de l'erreur la valeur est commodément error(nil).
  2. Si la fonction renvoie une erreur, l'utilisation de return nil renverra la valeur d'interface nulle souhaité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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn