Lompati ke konten utama
Modul 4 · Pelajaran 2 dari 517/50 dalam kursus~15 min
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
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

Penciptaan

Go
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 append

append: selalu tetapkan hasilnya

append menambahkan elemen dan mengembalikan potongan baru (berpotensi mengalokasikan array baru jika kapasitasnya tidak mencukupi):

Go
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):

Go
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

Go
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:

Go
out := make([]int, len(sub))
copy(out, sub)

Cobalah

Latihan#go.m4.l2.e1
Upaya: 0Memuat…

Buat irisan dengan [1, 2, 3] dan gunakan append untuk menambahkan 4.

Memuat editor…
Tunjukkan petunjuk

SELALU tetapkan hasil penambahan kembali ke `s`.

Solusi tersedia setelah 3 upaya

Latihan#go.m4.l2.e2
Upaya: 0Memuat…

Gunakan ekspresi irisan untuk mengekstrak elemen dari indeks 1 inklusif hingga 3 eksklusif (yaitu [20, 30]).

Memuat editor…
Tunjukkan petunjuk

Sintaks: `s[start:end]`, `start` inklusif, `end` eksklusif.

Solusi tersedia setelah 3 upaya

Quiz#go.m4.l2.e3
Siap

Manakah dari berikut ini yang SALAH untuk ditulis?

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
Pilihan jawaban

Rekap

  • []T: tampilan dinamis pada array; rangkap tiga (ptr, len, tutup).
  • make([]T, len, cap) untuk melakukan pra-alokasi; var s []T untuk 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.