Panjang array yang tidak bisa berubah menjadi kendala ketika jumlah data baru diketahui saat program berjalan. Go menjawab kebutuhan ini dengan slice: struktur data paling sering dipakai di Go untuk menampung kumpulan nilai. Slice memberi tampilan (view) ke atas deretan elemen, dan jumlah elemen yang terlihat bisa tumbuh atau menyusut tanpa mengubah tipe. Pada chapter ini kita belajar membuat slice, mengakses elemennya, dan memotongnya dari slice lain.

Membuat Slice #

Cara paling ringkas membuat slice adalah literal dengan tanda kurung siku kosong: []T{...}. Perbedaan satu karakter ini penting: [3]int adalah array tiga slot, sedangkan []int adalah slice tanpa panjang yang terikat pada tipenya.

go
buah := []string{"apel", "jeruk", "mangga", "pisang"}
nilai := []int{80, 90, 75}

Kedua variabel di atas memakai deklarasi pendek := seperti yang sudah kita kenal pada chapter Variabel . Karena panjang tidak menjadi bagian dari tipe slice, nilai boleh berisi tiga maupun seratus elemen dengan tipe yang sama. Deklarasi var data []float64 tanpa nilai awal menghasilkan slice bernilai nil yang masih sah dipakai untuk dibaca; perilaku nil ini kita bedah tuntas pada chapter nil Slice dan nil Map .

Go juga menyediakan fungsi make untuk membuat slice dengan panjang dan kapasitas yang kita tentukan sendiri. Fungsi tersebut berperan penting saat kita mengelola pertumbuhan data, jadi pembahasannya kita khususkan pada chapter Slice: Length dan Capacity .

Membaca Elemen dan Memotong Slice #

Elemen slice diakses dengan indeks berbasis nol, sama seperti array: buah[1] membaca elemen kedua, dan len(buah) mengembalikan jumlah elemen yang sedang terlihat. Operator pemotongan a[low:high] membuat slice baru yang menampilkan elemen mulai indeks low sampai tepat sebelum high, sehingga elemen pada indeks high tidak ikut terbawa.

Kedua batas boleh dihilangkan: a[:2] berarti dari awal sampai sebelum indeks 2, a[2:] berarti dari indeks 2 sampai akhir, dan a[:] menampilkan seluruh elemen. Berikut hasil pemotongan pada slice buah dengan empat elemen:

go
potongan := buah[1:3] // [jeruk mangga]
awal := buah[:2]      // [apel jeruk]
akhir := buah[2:]     // [mangga pisang]

Slice Tanpa Elemen #

Slice boleh dibuat dengan nol elemen dan tetap berfungsi normal. Literal []int{} menghasilkan slice kosong yang tercetak sebagai [], len-nya 0, dan slice tersebut masih bisa ditambah elemen. Perlu dibedakan dua keadaan yang sama-sama tampil kosong: slice kosong yang dibuat dengan literal, dan slice nil hasil deklarasi var tanpa nilai — keduanya mencetak [], dan pembedaannya kita selidiki pada chapter khusus.

Program Utuh #

Berkas slice-demo.go menggabungkan pembuatan literal, pengaksesan indeks, pemotongan, serta slice kosong dalam satu program. Jalankan berkas tersebut dengan go run slice-demo.go dari direktori chapter:

go
package main

import "fmt"

func main() {
	// Literal slice: panjang tidak ditulis, hanya [].
	buah := []string{"apel", "jeruk", "mangga", "pisang"}
	fmt.Println("buah     :", buah)
	fmt.Println("len(buah):", len(buah))
	fmt.Println("buah[1]  :", buah[1])

	// Slicing: potongan a[low:high] tanpa elemen pada indeks high.
	potongan := buah[1:3]
	fmt.Println("potongan :", potongan)
	fmt.Println("len      :", len(potongan), "cap:", cap(potongan))

	// Slice kosong: nol elemen, tampil sebagai [].
	kosong := []int{}
	fmt.Println("kosong   :", kosong, "len:", len(kosong))

	// Deklarasi tanpa nilai: slice bernilai nil, tampil sebagai [].
	var belum []float64
	fmt.Println("belum    :", belum, "len:", len(belum))
}

Output yang Dihasilkan:

text
buah     : [apel jeruk mangga pisang]
len(buah): 4
buah[1]  : jeruk
potongan : [jeruk mangga]
len      : 2 cap: 3
kosong   : [] len: 0
belum    : [] len: 0

Mari kita telaah baris demi baris program di atas:

  1. Baris 6 (buah := []string{...}): membuat slice string empat elemen dengan literal; tanda [] tanpa angka menandakan slice, bukan array.
  2. Baris 7–9: len(buah) mengembalikan 4 dan buah[1] membaca elemen kedua bernilai "jeruk".
  3. Baris 12 (potongan := buah[1:3]): memotong elemen indeks 1 dan 2; elemen indeks 3 (pisang) tidak ikut karena batas atas bersifat eksklusif.
  4. Baris 14 (len ... cap): potongan berisi 2 elemen. Nilai cap (kapasitas) sebesar 3 mengukur ruang penyimpanan di belakangnya dan dibahas tuntas pada chapter berikutnya.
  5. Baris 17 (kosong := []int{}): literal nol elemen menghasilkan slice kosong yang tercetak [] dengan len 0.
  6. Baris 21 (var belum []float64): deklarasi tanpa nilai menghasilkan slice nil; tampilannya juga [] sehingga pembaca perlu memakai pembanding == nil untuk membedakannya.

Dua angka len dan cap yang muncul di output baris keempat adalah kunci memahami cara slice mengelola memorinya. Chapter berikutnya membedah kedua angka tersebut beserta pola pertumbuhan kapasitasnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

slice-demo.go

Unduh berkas
go
package main

import "fmt"

func main() {
	// Literal slice: panjang tidak ditulis, hanya [].
	buah := []string{"apel", "jeruk", "mangga", "pisang"}
	fmt.Println("buah     :", buah)
	fmt.Println("len(buah):", len(buah))
	fmt.Println("buah[1]  :", buah[1])

	// Slicing: potongan a[low:high] tanpa elemen pada indeks high.
	potongan := buah[1:3]
	fmt.Println("potongan :", potongan)
	fmt.Println("len      :", len(potongan), "cap:", cap(potongan))

	// Slice kosong: nol elemen, tampil sebagai [].
	kosong := []int{}
	fmt.Println("kosong   :", kosong, "len:", len(kosong))

	// Deklarasi tanpa nilai: slice bernilai nil, tampil sebagai [].
	var belum []float64
	fmt.Println("belum    :", belum, "len:", len(belum))
}