Warum ist der Schnittstellenwert „nil' in Go nicht gleich „error(nil)'?

Patricia Arquette
Freigeben: 2024-10-30 18:45:30
Original
626 Leute haben es durchsucht

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

Vergleich von Nil-Schnittstelleninstanzen

Bedenken Sie den folgenden 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) // Displays "Error is not nil"
}</code>
Nach dem Login kopieren

Überraschenderweise führt dieser Code zu „ „Fehler ist nicht Null“, trotz der Absicht, auf die Null-Bedingung zu testen.

Der Schlüssel zum Verständnis dieses Verhaltens liegt in der Art und Weise, wie Go Schnittstellen implementiert. Intern bestehen Schnittstellenwerte aus einem Typ und einem Wert. Während der Wert Null sein kann, ist der Typ niemals Null. Im gegebenen Beispiel ist (*Goof)(nil) ein Schnittstellenwert mit dem Typ „*Goof“ und dem Nullwert.

Der Fehlerschnittstellentyp unterscheidet sich jedoch vom Typ „*Goof“. Daher sind (*Goof)(nil) und error(nil) nicht gleich, obwohl sie beide Nullwerte enthalten. Dies geht aus dem folgenden Code hervor:

<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>
Nach dem Login kopieren

Um dieses Problem zu beheben, gibt es mehrere Ansätze:

  1. Deklarieren Sie var err error anstelle von var g *Goof, da err Null ist Der Wert ist praktischerweise error(nil).
  2. Wenn die Funktion einen Fehler zurückgibt, wird mit return nil der gewünschte Null-Schnittstellenwert zurückgegeben.

Das obige ist der detaillierte Inhalt vonWarum ist der Schnittstellenwert „nil' in Go nicht gleich „error(nil)'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!