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:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Ausgabe (versuchen Sie es auf dem Go-Spielplatz ):
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 10
x: [1 2 3 4]
a: [1 2 3 4 0 0 0 0 0 0]
Wir haben ein "Backing" -Array a
mit Länge erstellt 10
. Dann erstellen wir das x
Ziel-Slice, indem wir dieses a
Array aufteilen. Das y
Slice wird mit dem zusammengesetzten Literal erstellt []int{3, 4}
. Nun , wenn wir anhängen y
zu x
, ist das Ergebnis der erwartete [1 2 3 4]
, aber was werden kann , überraschend ist , dass die Träger Array a
auch geändert, weil Kapazität x
heißt , 10
die ausreicht, anhängen , y
um es, so x
wird Resliced , die auch die gleiche verwenden a
Trägeranordnung und append()
kopiert dort Elemente von y
.
Wenn Sie dies vermeiden möchten, können Sie einen vollständigen Slice-Ausdruck verwenden, der die Form hat
a[low : high : max]
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]
:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Ausgabe (probieren Sie es auf dem Go Playground )
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 2
x: [1 2 3 4]
a: [1 2 0 0 0 0 0 0 0 0]
Wie Sie sehen können, erhalten wir das gleiche x
Ergebnis, aber das Hintergrundarray a
hat sich nicht geändert, da die Kapazität von x
"nur" war 2
(dank des vollständigen Slice-Ausdrucks a[:2:2]
). Zum Anhängen wird ein neues Hintergrundarray zugewiesen, in dem die Elemente von beiden x
und gespeichert werden können y
, das sich von unterscheidet a
.
append()
eine Variadic-Funktion, mit der...
Sie mehrere Argumente aus einem Slice an eine Variadic-Funktion übergeben können.