Warum führt der Vergleich eines Null-Slices mit einer Schnittstelle{} zu einem anderen Ergebnis als der direkte Vergleich eines Null-Slices mit Null?

Barbara Streisand
Freigeben: 2024-11-05 05:59:02
Original
660 Leute haben es durchsucht

Why does comparing a nil slice to an interface{} result in a different outcome than directly comparing a nil slice to nil?

Nil-Slice an die Schnittstelle übergeben: Das Rätsel lösen

In Go kann die Unterscheidung zwischen einem Null-Slice und einer Null-Schnittstelle{} einen Wert haben zu unerwarteten Ergebnissen führen. Betrachten Sie den folgenden Spielplatzauszug:

<code class="go">package main

import "fmt"

func main() {
    var i []int = nil
    yes(i) // true
    no(i)  // false
}

func yes(thing []int) {
    fmt.Println(thing == nil)
}

func no(thing interface{}) {
    fmt.Println(thing == nil)
}</code>
Nach dem Login kopieren

Warum erzeugen diese Funktionen unterschiedliche Ausgaben?

Schnittstelle verstehen{}

Eine Schnittstellenvariable{} ähnelt einer Struktur mit zwei Feldern: Typ und Daten. In diesem Fall sieht es aus wie {[]int (type), nil (data)}.

Nil Slice vs. Nil Interface

In ja, das Null Slice wird direkt übergeben. Der Vergleich prüft, ob nil gleich nil ist, was als true ausgewertet wird.

In no wird das Null-Slice in eine Schnittstelle {} eingeschlossen, was zu {[]int (type), nil (data)} führt. Beim Vergleich dieser Schnittstelle mit Null wird überprüft, ob der Typ Null ist, was nicht der Fall ist. Daher ist die Ausgabe falsch.

Grund für den Unterschied

Dieses Verhalten ergibt sich aus der Tatsache, dass Schnittstellen sowohl Typ als auch Wert kapseln. Beim Vergleich einer Schnittstelle mit Null wird nach einem Nulltyp gesucht, während der Vergleich des zugrunde liegenden Datenwerts anders ist. Im Fall von „Nein“ ist der Typ nicht Null, sodass der Vergleich „Falsch“ zurückgibt.

Schlussfolgerung

Das scheinbar paradoxe Verhalten ist auf die subtilen Unterschiede zwischen Null-Slices zurückzuführen und keine Schnittstellen. Das Verständnis dieser Unterscheidung ist entscheidend, um Verwirrung bei der Arbeit mit Schnittstellen in Go zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum führt der Vergleich eines Null-Slices mit einer Schnittstelle{} zu einem anderen Ergebnis als der direkte Vergleich eines Null-Slices mit Null?. 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