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 ?

Pourquoi une instance nulle d'une structure qui satisfait l'interface d'erreur n'est-elle pas comparable à zéro ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 07:50:30839parcourir

Why does a nil instance of a struct that satisfies the error interface not compare equal to nil?

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 :

  • Déclarer l'erreur d'erreur au lieu de var g *Goof. Cela initialise err à la valeur zéro du type d'erreur, qui est nil.
  • Dans les fonctions renvoyant des erreurs, renvoyez nil explicitement au lieu de le laisser implicite.

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!

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