Heim > Backend-Entwicklung > Golang > Warum verhält sich ein Nil-Slice anders, wenn es in Go an eine Schnittstelle übergeben wird?

Warum verhält sich ein Nil-Slice anders, wenn es in Go an eine Schnittstelle übergeben wird?

Susan Sarandon
Freigeben: 2024-11-03 05:32:02
Original
309 Leute haben es durchsucht

Why Does a Nil Slice Behave Differently When Passed to an Interface in Go?

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

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!

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