Maison > développement back-end > Golang > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-30 18:45:30
original
684 Les gens l'ont consulté

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>
Copier après la connexion

É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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal