Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist ein an eine Schnittstelle in Go übergebenes Null-Slice nicht gleich Null?

Warum ist ein an eine Schnittstelle in Go übergebenes Null-Slice nicht gleich Null?

Barbara Streisand
Barbara StreisandOriginal
2024-11-04 01:28:03220Durchsuche

Why Does a Nil Slice Passed to an Interface in Go Not Equal Nil?

Das Null-Slice-Paradoxon in Go-Schnittstellen verstehen

Warum ist das Ergebnis nicht Null, wenn ein Null-Slice als Schnittstelle übergeben wird? Dieses rätselhafte Verhalten kann durch das Verständnis der zugrunde liegenden Implementierung von Go-Schnittstellen erklärt werden.

In Go ist eine Interface{}-Variable im Wesentlichen eine Doppelfeldstruktur, die aus einem Typdeskriptor und einem Datenwert besteht, wie durch die veranschaulicht Iface struct:

struct Iface {
    Itab*   tab;
    void*   data;
};

Jetzt analysieren wir die beiden Funktionsaufrufe im bereitgestellten Code:

<code class="go">yes([]int{}) // output: true
no([]int{})  // output: false</code>

ja Funktion:

In Bei der Funktion „yes“ wird der Wert []int{} als Parameter thing übergeben. Da „yes“ nur einen Slice-Parameter akzeptiert, behandelt der Compiler „nil“ als Slice mit dem Wert Null. Somit wird aus der Vergleichssache == nil nil == nil, was true zurückgibt.

no Function:

Im Gegensatz dazu erwartet die no-Funktion eine Schnittstelle{} Parameter. Wenn Sie den Wert []int{} übergeben, verpackt Go ihn automatisch in einen Interface{}-Typ. Konvertieren Sie es effektiv in interface{[]int, nil}. Das Vergleichsding == nil wird jetzt zu interface{[]int, nil} == nil ausgewertet, was „false“ ergibt.

Dieses Verhalten wird in den Go-FAQs weiter erläutert, in denen erklärt wird, dass „Schnittstellen, die nil enthalten, nur“ sind gleich Null, wenn alle ihre Mitglieder Null sind“ (d. h. im Fall dieses Beispiels kann []int (das Typmitglied) nicht Null sein).

Daher ist es beim Umgang mit Null-Slices in Schnittstellen so Es ist wichtig, sich dieser Eigenart bewusst zu sein und die zugrunde liegende Implementierung zu berücksichtigen, um das Verhalten richtig zu interpretieren.

Das obige ist der detaillierte Inhalt vonWarum ist ein an eine Schnittstelle in Go übergebenes Null-Slice nicht gleich Null?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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