Beim Arbeiten mit einer variadischen Funktion, die mehrere Argumente akzeptiert, kann die Handhabung eines Slices-Slices eine Herausforderung darstellen. Hier ist ein konkreter Fall, in dem das Entpacken eines Slices-Slices einen Compilerfehler verursachen kann:
Betrachten Sie die folgende Variadic-Funktion:
<code class="go">func unpack(args ...interface{})</code>
Wenn wir ein Slice-Slice haben, können wir es direkt übergeben ohne Probleme an die Funktion übergeben:
<code class="go">slice := []interface{}{1, 2, 3} unpack(slice) // works unpack(slice...) // also works</code>
Wenn wir jedoch eine Slice von Schnittstellen haben, führt der Versuch, eine entpackte Version zu übergeben, zu einem Kompilierungsfehler:
<code class="go">sliceOfSlices := [][]interface{}{ []interface{}{1, 2}, []interface{}{101, 102}, } unpack(sliceOfSlices) // works unpack(sliceOfSlices...) // compiler error</code>
The Fehlermeldung lautet:
cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack
Um dieses Verhalten zu verstehen, müssen wir uns mit der Spezifikation für die Übergabe von Argumenten an variadische Parameter in Go befassen:
"Wenn das letzte Argument zuweisbar ist an einen Slice-Typ []T kann er unverändert als Wert für einen ...T-Parameter übergeben werden, wenn auf das Argument ... folgt.
In diesem Fall der variadic-Parameter ist ...interface{} und eine direkte Zuweisung von SliceOfSlices (vom Typ [][]interface{}) an args (vom Typ []interface{}) ist ungültig.
Also, Wie können wir den entpackten Inhalt von SliceOfSlices an unpack() senden? Die Lösung besteht darin, ein neues Slice vom Typ []interface{} zu erstellen, die Elemente zu kopieren und es dann mit ... zu übergeben.
<code class="go">var sliceOfSlices2 []interface{} for _, v := range sliceOfSlices { sliceOfSlices2 = append(sliceOfSlices2, v) } unpack(sliceOfSlices2...)</code>
Diese Methode stellt sicher, dass jedes innere Slice als Element dargestellt wird in einem einzigen Slice, wodurch es mit dem variadic-Parameter ...interface{} kompatibel ist.
Das obige ist der detaillierte Inhalt vonWie entpacke ich ein Slice-Slice in eine Variadic-Funktion in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!