Bir dilim yalnızca bir dizinin bir bölümüdür, belirli bir depolama alanı yoktur.
Bu, bir dizinin aynı bölümü üzerinde iki diliminiz varsa, her iki dilimin de aynı değerleri "içermesi" gerektiği anlamına gelir.
İşte burada olduğunu tam olarak budur: İlk append
yaptığınızda
- , sen büyüklük
2
altta yatan bir dizi üzerinden büyüklüğü 2
yeni pay alıyor. (Her append de tahsis gerek kalmaması append
genellikle hemen gerekli olandan daha fazla yer ayırır) sonraki append
yaptığınızda
- , sen büyüklük
3
yeni bir dilim almak ancak alttaki dizi büyüklüğü 4
taşımaktadır .
- Bu, sonraki
append
'un yeni bir diziye gerek duymadığı anlamına gelir. Bu nedenle x
ve y
her ikisi de öncü dilim s
ile aynı temel diziyi kullanacaktır. Bu dizinin aynı slotunda 11
ve daha sonra 12
yazıyorsunuz, iki farklı dilim alsanız bile (unutmayın, sadece pencereler).
Her sonra dilim kapasitesini yazdırarak kontrol edebilirsiniz ekleyin:
fmt.Println(cap(s))
Eğer x
ve y
farklı değerlere sahip olmak istiyorsanız, bir copy yapmalıyım böyle örneğin :
s := []int{5}
s = append(s, 7)
s = append(s, 9)
x := make([]int,len(s))
copy(x,s)
x = append(x, 11)
y := append(s, 12)
fmt.Println(s, x, y)
burada diğer çözüm ihtiyacı daha fazla olmaması için s
dilim geride dizinin kapasitesini zorlamak olabilirdi ed on (bu şekilde, aşağıdaki iki append
sahip yeni bir dizi kullanımı sağlanması):
s := []int{5}
s = append(s, 7)
s = append(s, 9)
s = s[0:len(s):len(s)]
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y)
Ayrıca bkz Re-slicing slices in Golang