Cap and Length in Go Slice
original := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
// original: len=10, cap=10
slice1 := original[2:6] // [3,4,5,6]
// slice1: len=4, cap=8 (karena mulai dari index 2, sisa capacity = 10-2 = 8)
slice2 := slice1[1:4] // [4,5,6]
// slice2: len=3, cap=7 (ini yang menjadi pertanyaan)Mengapa Capacity = 7?
Kunci pemahamannya: Capacity dihitung dari pointer awal slice sampai akhir array underlying.
Array Underlying:
[1,2,3,4,5,6,7,8,9,10](capacity = 10)Slice1 (
original[2:6]):Pointer: index 2 (nilai 3)
Length: 4 elemen (index 2-5: [3,4,5,6])
Capacity: 8 (dari index 2 sampai akhir array: 10-2 = 8)
Slice2 (
slice1[1:4]):Pointer: index 1 dari slice1 (yang sebenarnya index 3 dari array underlying)
Length: 3 elemen ([4,5,6])
Capacity: 7 (dari index 3 sampai akhir array: 10-3 = 7)
Visualisasi
Contoh Kode untuk Memperjelas
Output:
Rumus Umum Capacity
Untuk slice original[start:end]:
Length =
end - startCapacity =
cap(original) - start
Jadi dalam kasus ini:
slice1 = original[2:6]β cap = 10 - 2 = 8slice2 = slice1[1:4]β slice1 punya cap = 8, start = 1Tapi ingat!
slice1[1]sebenarnya adalahoriginal[3]Jadi cap(slice2) = cap(original) - 3 = 10 - 3 = 7
Inilah mengapa capacity menjadi 7 - karena dihitung dari pointer awal slice terhadap array underlying, bukan dari slice parent-nya.
Last updated