Maison  >  Article  >  développement back-end  >  Pourquoi une instance d’erreur nulle n’est-elle pas comparable à zéro ?

Pourquoi une instance d’erreur nulle n’est-elle pas comparable à zéro ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 06:51:28947parcourir

Why Does a Nil Error Instance Not Compare as Nil?

Les instances d'erreur nulles ne s'affichent pas comme nulles

Pour comprendre les comparaisons d'interfaces, il est crucial de reconnaître qu'elles évaluent à la fois le type et la valeur.

Considérez l'extrait de code :

<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 nil"
}</code>

Ici, nous nous attendons à "L'erreur n'est pas nulle" puisque g est nul. Cependant, en raison des comparaisons d'interfaces, nous obtenons "L'erreur est nulle". En effet, (*Goof)(nil) a un type différent de error(nil).

Pour résoudre ce problème, vous pouvez déclarer var err error au lieu de var g *Goof. Alternativement, si votre fonction renvoie une erreur, renvoyez simplement nil.

Pour plus de précisions, les comparaisons d'interface vérifient si les types sont identiques, et non si un type implémente une interface. En tant que tel, l'exemple suivant démontre que même des interfaces non nulles avec les mêmes données sous-jacentes peuvent être considérées comme inégales en raison de différents types :

<code class="go">package main

import "fmt"

type Bob int

func main() {
    var x int = 3
    var y Bob = 3
    var ix, iy interface{} = x, y
    fmt.Println(ix == iy)
}</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