Heim > Backend-Entwicklung > Golang > Wie entpacke ich ein Slice-Slice in eine Variadic-Funktion in Go?

Wie entpacke ich ein Slice-Slice in eine Variadic-Funktion in Go?

Patricia Arquette
Freigeben: 2024-10-28 12:14:31
Original
577 Leute haben es durchsucht

How to Unpack a Slice of Slices into a Variadic Function in Go?

Variadische Funktion und entpacktes Slices-Slice

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

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

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

The Fehlermeldung lautet:

cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack
Nach dem Login kopieren

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

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!

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