Nil-Slice vs. Nil-Schnittstelle
In Go ist ein Null-Slice nicht dasselbe wie eine Null-Schnittstelle. Dieses Verhalten wird im folgenden Code demonstriert:
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // output: true no(i) // output: false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
Der Unterschied in der Ausgabe zwischen den beiden Funktionen liegt an der Art und Weise, wie Go mit Schnittstellentypen umgeht.
Schnittstellentypen
Ein Schnittstellentyp in Go ist eine Sammlung von Methoden, die durch einen bestimmten Werttyp implementiert werden können. Wenn eine Interface{}-Variable verwendet wird, kann sie jeden Wert eines beliebigen Typs enthalten, der die Schnittstelle implementiert.
Nil Interface
Wenn eine Interface{}-Variable zugewiesen wird auf Null gesetzt, wird das Datenfeld der Schnittstelle auf Null gesetzt, das Typfeld jedoch nicht. Daher ist eine Nullschnittstelle nicht gleich Null.
Nil Slice
Andererseits ist ein Null-Slice einfach ein Slice ohne Elemente. Wenn Sie ein Null-Slice mit Null vergleichen, wird der Vergleich als wahr ausgewertet, da sowohl die Daten- als auch die Typfelder des Slice auf Null gesetzt sind.
Schlussfolgerung
Daher gilt: Der Unterschied in der Ausgabe zwischen den beiden Funktionen im Codebeispiel ist auf die Tatsache zurückzuführen, dass nil([]int) ein Null-Slice ist, während nil(interface{}) eine Null-Schnittstelle ist. Ein Null-Slice wird im Vergleich zu Null als wahr ausgewertet, während eine Null-Schnittstelle als falsch ausgewertet wird.
Das obige ist der detaillierte Inhalt vonWarum ist „nil([]int)' gleich „nil', aber „nil(interface{})' nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!