2017-09-19 2 views
1

I 2 Scheiben haben,Concatenate 2 Scheiben in golang

s1 := []int{1, 2, 3, 4, 5} 
s2 := []int{3, 4, 5, 6, 7} 

ich das resultierende

s3 = []int{1, 2, 3, 4, 5, 3, 4, 5, 6, 7} 

möchte ich tue so etwas wie:

for _, x := range s1 { 
     s2 = append(s2, x) 
    } 

Das sieht sehr triviale Frage, aber Vertrauen Sie mir, ich finde keine Ein-Zeilen-Lösung. Wie können wir darüber gehen?

Antwort

5

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.

+0

Vielen Dank. 1 Liner arbeitet. – impossible

4

Ich würde Ihnen empfehlen, einen Blick auf diese Seite zu geben: https://github.com/golang/go/wiki/SliceTricks

Es ist eine offizielle Dokumentation für Scheiben von golang. Für Ihr Problem brauchen Sie nur append :)

+0

Wirklich cool ist es! – impossible

+0

Wenn es hilfreich ist, bitte upvote die Antwort :) –

+0

Sicher. Es ist hilfreich. :) – impossible