Das besondere Verhalten von Nil-Slices in Go-Schnittstellen
In Go kann Slices der Nullwert zugewiesen werden, was ein leeres Slice bedeutet. Wenn jedoch ein Null-Slice als Argument an eine Funktion übergeben wird, die eine Schnittstelle{} erwartet, entsteht ein überraschender Unterschied im Verhalten.
Bedenken Sie den folgenden Go-Spielplatz:
<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>
Im Im obigen Beispiel erhalten zwei Funktionen, ja und nein, dasselbe Null-Slice als ihr Argument. Die Ausgabe der beiden Funktionen unterscheidet sich jedoch. „yes“ gibt „true“ aus, was darauf hinweist, dass der Slice tatsächlich Null ist. nein, dagegen wird falsch ausgegeben.
Warum gibt es diese Diskrepanz? Die Antwort liegt in der Art und Weise, wie Null-Slices in Go-Schnittstellen intern dargestellt werden.
Eine Interface{}-Variable, die zur Darstellung einer Vielzahl von Typen verwendet wird, besteht aus zwei Feldern: einem Typ und einem Datenzeiger. Wenn ein Null-Slice an eine Funktion übergeben wird, die eine Schnittstelle{} erwartet, wird es in einen Schnittstellentyp {} verpackt und der Datenzeiger wird auf Null gesetzt.
Im Fall von „Ja“ wird das direkt verglichen Argument zu Null, was effektiv fragt, ob das Slice selbst Null ist. Dieser Vergleich gibt „true“ zurück, da das Slice tatsächlich leer ist.
Die No-Funktion empfängt jedoch das Null-Slice, das in eine Schnittstelle{} eingeschlossen ist. Der Vergleich erfolgt in diesem Fall nicht nur zwischen dem Slice und Null, sondern zwischen der gesamten Schnittstelle {} und Null. Innerhalb der Laufzeit läuft dieser Vergleich darauf hinaus, zu testen, ob der Datenzeiger der Schnittstelle {} Null ist, was falsch ist, da der Schnittstellen-Wrapper dafür Speicher reserviert hat.
Dieses Verhalten ist auch in den FAQ von Go dokumentiert:
"Ein häufiges Problem bei an Schnittstellen übergebenen Null-Slices: Da ein Null-Slice durch einen Null-Schnittstellenwert dargestellt wird, kann das Schreiben von if i == nil möglich sein fälschlicherweise erfolgreich sein, wenn der Wert einer Schnittstelle i getestet wird (eine Null-Schnittstelle ist falsch).“
Das obige ist der detaillierte Inhalt vonWarum verhält sich ein Nil-Slice anders, wenn es in Go an eine Schnittstelle übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!