Maison > développement back-end > Golang > 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
Libérer: 2024-10-31 07:50:30
original
954 Les gens l'ont consulté

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

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

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