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.

  1. Array Underlying: [1,2,3,4,5,6,7,8,9,10] (capacity = 10)

  2. 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)

  3. 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 - start

  • Capacity = cap(original) - start

Jadi dalam kasus ini:

  • slice1 = original[2:6] β†’ cap = 10 - 2 = 8

  • slice2 = slice1[1:4] β†’ slice1 punya cap = 8, start = 1

  • Tapi ingat! slice1[1] sebenarnya adalah original[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