Array & Slice
Koleksi berurutan: array tetap, slice fleksibel, append, dan slicing.
Array: ukuran tetap
var nilai [3]int // [0 0 0]
hari := [3]string{"Sen", "Sel", "Rab"}
Panjang array adalah bagian dari tipenya: [3]int dan [4]int adalah tipe berbeda. Array jarang dipakai langsung karena kaku.
Slice: koleksi fleksibel
Slice adalah "jendela" ke sebuah array di belakang layar. Ia punya tiga komponen: pointer ke array, len (jumlah elemen) dan cap (kapasitas).
s := []int{1, 2, 3}
fmt.Println(s[0], len(s), cap(s)) // 1 3 3
append
Menambah elemen. Selalu tampung hasilnya:
s = append(s, 4)
s = append(s, 5, 6)
s = append(s, lain...) // menggabungkan slice
Jika kapasitas penuh, Go membuat array baru yang lebih besar (kira-kira dua kali lipat), menyalin isi lama, lalu menambah elemen. Itu sebabnya append bisa mengembalikan slice yang menunjuk array berbeda.
make
Membuat slice dengan panjang dan kapasitas awal:
s := make([]int, 3) // [0 0 0], len 3 cap 3
t := make([]int, 0, 10) // kosong, kapasitas 10
Jika sudah tahu jumlah data, make dengan kapasitas mengurangi alokasi ulang.
Slicing
s := []int{10, 20, 30, 40, 50}
s[1:3] // [20 30] (index 1 sampai SEBELUM 3)
s[:2] // [10 20]
s[2:] // [30 40 50]
Hasil slicing berbagi array yang sama dengan aslinya. Mengubah elemen di satu slice dapat memengaruhi yang lain. Gunakan copy untuk membuat salinan independen:
salinan := make([]int, len(s))
copy(salinan, s)
Menghapus elemen
s = append(s[:1], s[2:]...) // hapus elemen index 1
nil slice
var s []int adalah nil slice: len 0, dan aman dipakai di append maupun range.
Slice 2 dimensi
grid := [][]int{{1, 2}, {3, 4}}