Ich denke, es ist wichtig zu betonen und zu wissen, dass, wenn der Zielslice (der Slice, an den angehängt wird) über ausreichende Kapazität verfügt, der Append "vor Ort" erfolgt, indem das Ziel neu gesliced wird (neu gesliced, um seine Länge zu erhöhen, um die anhängbaren Elemente unterzubringen).
Dies bedeutet, dass wenn das Ziel durch Slicing eines größeren Arrays oder Slices erstellt wurde, das zusätzliche Elemente über die Länge des resultierenden Slices hinaus hat, können sie überschrieben werden.
Um dies zu demonstrieren, sieh dir dieses Beispiel an:
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 (versuche es auf dem Go Playground):
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 "Basierendes" Array a
mit der Länge 10
erstellt. Dann erstellen wir den Zielslice x
, indem wir dieses a
Array slicen, y
Slice wird durch das Composite-Literal []int{3, 4}
erstellt. Nun, wenn wir y
zu x
anhängen, ist das Ergebnis der erwartete [1 2 3 4]
, aber was überraschend sein könnte, ist, dass sich auch das Basierende Array a
geändert hat, da die Kapazität von x
10
beträgt, was ausreicht, um y
daran anzuhängen, also wird x
a verwenden wird, und append()
wird Elemente von y
dorthin kopieren.
Wenn Sie dies vermeiden möchten, können Sie einen vollen Slicen-Ausdruck verwenden, der die Form hat
a[low : high : max]
der einen Slice konstruiert und auch die Kapazität des resultierenden Slices steuert, indem er auf max - low
gesetzt wird.
Siehe das modifizierte Beispiel (der einzige Unterschied besteht darin, dass wir x
so erstellen: 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 (versuche 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 du sehen kannst, erhalten wir das gleiche Ergebnis für x
, aber das basierende Array a
hat sich nicht geändert, weil die Kapazität von x
a[:2:2]). Um also den Append-Vorgang durchzuführen, wird ein neues Basierendes Array zugewiesen, das die Elemente von sowohl x
als auch y
a unterscheidet.