Ich versuche, die Scheibe [1, 2]
und die Scheibe zu kombinieren[3, 4]
. Wie kann ich das in Go machen?
Ich habe es versucht:
append([]int{1,2}, []int{3,4})
aber bekam:
cannot use []int literal (type []int) as type int in append
Die Dokumentation scheint jedoch darauf hinzudeuten, dass dies möglich ist. Was fehlt mir?
slice = append(slice, anotherSlice...)
go
append
slice
variadic-functions
Kevin Burke
quelle
quelle
append()
eine Variadic-Funktion, mit der...
Sie mehrere Argumente aus einem Slice an eine Variadic-Funktion übergeben können.foo()
obigen Beispiel enthält deris
Parameter eine Kopie des ursprünglichen Slice, dh er enthält eine Kopie der leichten Referenz auf dasselbe zugrunde liegende Array, len und cap. Wenn diefoo
Funktion ein Mitglied ändert, wird die Änderung auf dem Original angezeigt. Hier ist eine Demo . Der einzige wirkliche Aufwand besteht darin, dass ein neues Slice erstellt wird, wenn Sie noch keines hatten, z. B.:foo(1, 2, 3, 4, 5)
Dadurch wird ein neues Slice erstellt,is
das haltbar ist....
ein vorhandenes Slice verwenden, wird dieses Slice einfach übergeben. Wenn Sie einzelne Argumente übergeben, werden diese in einem neuen Slice zusammengefasst und übergeben. Ich habe keine Kenntnisse aus erster Hand über die genaue Mechanik, aber ich würde vermuten, dass dies:foo(1, 2, 3, 4, 5)
und dies:func foo(is ...int) {
nur Zucker zu diesem:foo([]int{1, 2, 3, 4, 5})
und dies :func foo(is []int) {
.Die Antwort auf Ihre Frage finden Sie
s3 := append(s2, s0...)
in der Go-Programmiersprachenspezifikation . Zum Beispiel,quelle
a[low : high : max]
) verwenden, der auch die maximale Kapazität angibt . Zum Beispiel hat das Slicea[0:2:4]
eine Kapazität von4
und es kann nicht neu geschnitten werden, um darüber hinausgehende Elemente einzuschließen, selbst wenn das Hintergrundarray danach tausend Elemente enthält.Nichts gegen die anderen Antworten, aber ich fand die kurze Erklärung in den Dokumenten leichter verständlich als die Beispiele in ihnen:
quelle
Ich denke, es ist wichtig darauf hinzuweisen und zu wissen, dass, wenn das Ziel-Slice (das Slice, an das Sie anhängen) über eine ausreichende Kapazität verfügt, das Anhängen "an Ort und Stelle" erfolgt, indem das Ziel neu aufgeteilt wird (erneutes Schneiden, um seine Länge zu erhöhen, um zu sein) in der Lage, die anhängbaren Elemente aufzunehmen).
Dies bedeutet, dass wenn das Ziel durch Schneiden eines größeren Arrays oder Slice erstellt wurde, das zusätzliche Elemente enthält, die über die Länge des resultierenden Slice hinausgehen, diese möglicherweise überschrieben werden.
Zur Demonstration sehen Sie dieses Beispiel:
Ausgabe (versuchen Sie es auf dem Go-Spielplatz ):
Wir haben ein "Backing" -Array
a
mit Länge erstellt10
. Dann erstellen wir dasx
Ziel-Slice, indem wir diesesa
Array aufteilen. Dasy
Slice wird mit dem zusammengesetzten Literal erstellt[]int{3, 4}
. Nun , wenn wir anhängeny
zux
, ist das Ergebnis der erwartete[1 2 3 4]
, aber was werden kann , überraschend ist , dass die Träger Arraya
auch geändert, weil Kapazitätx
heißt ,10
die ausreicht, anhängen ,y
um es, sox
wird Resliced , die auch die gleiche verwendena
Trägeranordnung undappend()
kopiert dort Elemente vony
.Wenn Sie dies vermeiden möchten, können Sie einen vollständigen Slice-Ausdruck verwenden, der die Form hat
Dadurch wird ein Slice erstellt und die Kapazität des resultierenden Slice durch Festlegen auf gesteuert
max - low
.Siehe das modifizierte Beispiel (der einzige Unterschied ist , dass wir schaffen
x
wie folgt aus :x = a[:2:2]
:Ausgabe (probieren Sie es auf dem Go Playground )
Wie Sie sehen können, erhalten wir das gleiche
x
Ergebnis, aber das Hintergrundarraya
hat sich nicht geändert, da die Kapazität vonx
"nur" war2
(dank des vollständigen Slice-Ausdrucksa[:2:2]
). Zum Anhängen wird ein neues Hintergrundarray zugewiesen, in dem die Elemente von beidenx
und gespeichert werden könneny
, das sich von unterscheideta
.quelle
Ich möchte die Antwort von @icza hervorheben und ein wenig vereinfachen, da es sich um ein entscheidendes Konzept handelt. Ich gehe davon aus, dass der Leser mit Slices vertraut ist .
Dies ist eine gültige Antwort auf die Frage. ABER wenn Sie die Slices 'a' und 'c' später im Code in einem anderen Kontext verwenden müssen, ist dies nicht die sichere Methode, um Slices zu verketten.
Lesen wir zur Erklärung den Ausdruck nicht in Form von Slices, sondern in Form von zugrunde liegenden Arrays:
append () erstellt nicht unbedingt ein neues Array! Dies kann zu unerwarteten Ergebnissen führen. Siehe Go Playground-Beispiel .
Verwenden Sie immer die Funktion make (), wenn Sie sicherstellen möchten, dass dem Slice ein neues Array zugewiesen wird. Zum Beispiel gibt es hier nur wenige hässliche, aber effizient genug Optionen für die Aufgabe.
quelle
Funktion append () und Spread-Operator
Zwei Slices können mithilfe der
append
Methode in der Standard-Golang-Bibliothek verkettet werden . Welches ist ähnlich wie dievariadic
Funktionsoperation. Also müssen wir verwenden...
quelle
append([]int{1,2}, []int{3,4}...)
wird funktionieren. Argumente an übergeben...
Parameter übergeben.Wenn
f
ist variadische mit einem letzten Parameterp
vom Typ...T
, dann innerhalb vonf
der Art derp
äquivalent zu geben[]T
.Wenn
f
ohne tatsächliche Argumente für aufgerufen wirdp
,p
lautet der übergebene Wert isnil
.Andernfalls handelt es sich bei dem übergebenen Wert um ein neues Slice vom Typ
[]T
mit einem neuen zugrunde liegenden Array, dessen aufeinanderfolgende Elemente die tatsächlichen Argumente sind, denen alle zugewiesen werden müssenT
. Die Länge und Kapazität des Slice ist daher die Anzahl der Argumente, die anp
jede Aufrufstelle gebunden sind und sich für diese unterscheiden können.Angesichts der Funktion und Aufrufe
quelle