Ben işaret ve hedef dilim (eklediğiniz dilim) yeterli kapasiteye sahip olduğunu bilmek önemli olduğunu düşünüyorum, eklenti "yerinde", hedefini yeniden (olması için uzunluğunu artırmak için reslicing) olacak ek öğeleri barındırabilir).
Bu, hedefin, elde edilen dilimin uzunluğunun ötesinde ek öğelere sahip daha büyük bir dizi veya dilim dilimlenerek oluşturulduğu takdirde, bunların üzerine yazılabilir.
Göstermek için şu örneğe bakın:
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)
Çıktı ( Go Playground'da deneyin ):
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]
a
Uzunluğunda bir "destek" dizisi oluşturduk 10
. Sonra x
bu a
diziyi dilimleyerek hedef dilimi yaratırız , y
dilim bileşik değişmezi kullanılarak oluşturulur []int{3, 4}
. Biz eklemek Şimdi ne zaman y
için x
, sonuç beklenen olduğu [1 2 3 4]
, ama ne şaşırtıcı olabilir destek dizisi olmasıdır a
kapasitesi nedeniyle de değişmiş x
IS 10
yeterlidir eklemek için y
kendisine, bu nedenle x
de aynı kullanacağı resliced olan a
sırt dizi ve append()
öğelerini y
oraya kopyalar .
Bundan kaçınmak istiyorsanız , forma sahip tam bir dilim ifadesi kullanabilirsiniz.
a[low : high : max]
bu da bir dilim oluşturur ve ayrıca elde edilen dilimin kapasitesini ayarlayarak kontrol eder max - low
.
Modifiye örneğe bakın (tek fark yarattığımız olmasıdır x
böyle: 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)
Çıktı ( Go Playground'da deneyin )
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]
Gördüğünüz gibi, aynı x
sonucu alıyoruz, ancak yedekleme dizisi a
değişmedi, çünkü kapasitesi x
"sadece" idi 2
(tam dilim ifadesi sayesinde a[:2:2]
). Bu nedenle, eki yapmak için, her ikisinin öğelerini saklayabilen x
ve y
farklı olan yeni bir destek dizisi ayrılır a
.
append()
variadic fonksiyon ve...
bir dilim gelen variadic çalışması için birden fazla argüman geçmemize izin verir.