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 amit Länge erstellt 10. Dann erstellen wir das xZiel-Slice, indem wir dieses aArray aufteilen. Das ySlice wird mit dem zusammengesetzten Literal erstellt []int{3, 4}. Nun , wenn wir anhängen yzu x, ist das Ergebnis der erwartete [1 2 3 4], aber was werden kann , überraschend ist , dass die Träger Array aauch geändert, weil Kapazität xheißt , 10die ausreicht, anhängen , yum es, so xwird Resliced , die auch die gleiche verwenden aTrä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 xwie 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 xErgebnis, aber das Hintergrundarray ahat 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 xund 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.