Heim  >  Artikel  >  Backend-Entwicklung  >  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
Patricia ArquetteOriginal
2024-10-28 12:14:31507Durchsuche

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>

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!

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