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]
aUzunluğunda bir "destek" dizisi oluşturduk 10. Sonra xbu adiziyi dilimleyerek hedef dilimi yaratırız , ydilim bileşik değişmezi kullanılarak oluşturulur []int{3, 4}. Biz eklemek Şimdi ne zaman yiçin x, sonuç beklenen olduğu [1 2 3 4], ama ne şaşırtıcı olabilir destek dizisi olmasıdır akapasitesi nedeniyle de değişmiş xIS 10yeterlidir eklemek için ykendisine, bu nedenle xde aynı kullanacağı resliced olan asırt dizi ve append()öğelerini yoraya 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 xbö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ı xsonucu alıyoruz, ancak yedekleme dizisi adeğ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 xve yfarklı 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.