Dies ist, was die eingebaute append()
Funktion ist: um Werte (die Werte eines Slice sein können) an das Ende eines anderen anhängen. Und das Ergebnis ist die Verkettung.
Wenn Sie s3
„unabhängig“ von s1
und s2
sein, dann s1
zu einer leeren oder nil
Scheibe anzuhängen, dann hängen Sie s2
zu dem Ergebnis:
s3 := append(append([]int{}, s1...), s2...)
fmt.Println(s3)
Wenn s3
kann/überlappen s1
, Sie können einfach anhängen s2
zu s1
:
s4 := append(s1, s2...)
fmt.Println(s4)
Output in beiden Fällen (versuchen Sie es auf dem Go Playground):
[1 2 3 4 5 3 4 5 6 7]
Hinweis: Was diese „überlappende“ bedeutet, dass wenn Sie Werte s1
anhängen, wenn es genügend Kapazität hat, wird keine neue Scheibe zugeordnet ist, s1
wird wiederhergestellt, um genug Länge zu haben, um die Elemente aufzunehmen, die Sie anhängen möchten. Dies kann überraschende Nebenwirkungen haben, wenn unbedacht, wie in diesem Beispiel verwendet:
arr := [...]int{1, 2, 3, 4, 5, 6, 7, 0, 0, 0}
s1 := arr[:5]
s2 := arr[2:7]
fmt.Println("s1:", s1, "cap:", cap(s1))
fmt.Println("s2:", s2)
s3 := append(s1, s2...)
fmt.Println("s3:", s3)
fmt.Println("s2:", s2)
Ausgabe wird (versuchen Sie es auf dem Go Playground):
s1: [1 2 3 4 5] cap: 10
s2: [3 4 5 6 7]
s3: [1 2 3 4 5 3 4 5 6 7]
s2: [3 4 5 3 4]
Was überraschend sein kann hierbei ist, dass, wenn wir angehängt s2
zu s1
und gespeichert das Ergebnis in s3
(was wir erwartet haben), Inhalte (Elemente) von s2
auch geändert. Der Grund dafür ist, dass append()
sah, dass s1
genug Kapazität hat, um s2
an es (Elemente von s2
) anhängen, so dass es kein neues Array erstellt, es nur s1
widerlegt und Elemente "in-Place" hinzugefügt. Aber der Bereich, in dem die zusätzlichen Elemente geschrieben wurden, ist genau derselbe Speicher, in dem sich Elemente von s2
befinden, so dass auch Elemente von s2
überschrieben wurden.
Vielen Dank. 1 Liner arbeitet. – impossible