Pelajaran modul (2/5)
Irisan: struktur idiomatik
slice adalah struktur data yang paling sering digunakan di Go: tampilan dinamis
atas array yang mendasarinya. Sintaks: []T. Berbeda dengan array, panjangnya adalah
bukan bagian dari tipe tersebut, dan Anda dapat mengembangkannya dengan append.
Anatomi sepotong
Secara internal, sebuah irisan adalah struktur tiga bidang:
- pointer ke elemen pertama dalam array yang mendasarinya
- panjang (
len): jumlah elemen yang terlihat - kapasitas (
cap): elemen tersedia dari awal tampilan ke akhir array yang mendasarinya
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3Penciptaan
a := []int{1, 2, 3} // literal
b := make([]int, 3) // [0 0 0] len=3 cap=3
c := make([]int, 3, 10) // len=3 cap=10 (reserved)
var d []int // nil slice: len=0 cap=0, still usable with appendappend: selalu tetapkan hasilnya
append menambahkan elemen dan mengembalikan potongan baru (berpotensi
mengalokasikan array baru jika kapasitasnya tidak mencukupi):
s := []int{1, 2, 3}
s = append(s, 4) // [1 2 3 4]
s = append(s, 5, 6, 7) // append multiple elements
s = append(s, altra...) // concatenate another slice (spread)Ekspresi irisan s[a:b]
Mengekstrak sub-bagian dari a (inklusif) ke b (eksklusif):
s := []int{10, 20, 30, 40, 50}
sub := s[1:4] // [20 30 40]
inizio := s[:2] // [10 20]
fine := s[3:] // [40 50]
intera := s[:] // [10 20 30 40 50]Sub-irisan berbagi array yang mendasarinya dengan irisan asli:
mutasi melalui sub[i] = ... juga terlihat di s.
Kesalahan: berbagi array
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s) // [99 2 3 4] — modified!Untuk mendapatkan salinan independen, gunakan copy atau append:
out := make([]int, len(sub))
copy(out, sub)Cobalah
Buat irisan dengan [1, 2, 3] dan gunakan append untuk menambahkan 4.
Tunjukkan petunjuk
SELALU tetapkan hasil penambahan kembali ke `s`.
Solusi tersedia setelah 3 upaya
Gunakan ekspresi irisan untuk mengekstrak elemen dari indeks 1 inklusif hingga 3 eksklusif (yaitu [20, 30]).
Tunjukkan petunjuk
Sintaks: `s[start:end]`, `start` inklusif, `end` eksklusif.
Solusi tersedia setelah 3 upaya
Manakah dari berikut ini yang SALAH untuk ditulis?
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)Rekap
[]T: tampilan dinamis pada array; rangkap tiga (ptr, len, tutup).make([]T, len, cap)untuk melakukan pra-alokasi;var s []Tuntuk potongan nihil yang dapat digunakan.s = append(s, ...): SELALU tetapkan hasilnya.s[a:b]berbagi array yang mendasarinya:copy(...)untuk salinan independen.- Irisan
nil= OK untuk dibaca/direntang/ditambahkan; sangat berbeda dengan peta nihil.