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.
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:
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:
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:
buah : [apel jeruk mangga pisang]
len(buah): 4
buah[1] : jeruk
potongan : [jeruk mangga]
len : 2 cap: 3
kosong : [] len: 0
belum : [] len: 0Mari kita telaah baris demi baris program di atas:
- Baris 6 (
buah := []string{...}): membuat slice string empat elemen dengan literal; tanda[]tanpa angka menandakan slice, bukan array. - Baris 7–9:
len(buah)mengembalikan4danbuah[1]membaca elemen kedua bernilai"jeruk". - Baris 12 (
potongan := buah[1:3]): memotong elemen indeks 1 dan 2; elemen indeks 3 (pisang) tidak ikut karena batas atas bersifat eksklusif. - Baris 14 (
len ... cap):potonganberisi 2 elemen. Nilaicap(kapasitas) sebesar 3 mengukur ruang penyimpanan di belakangnya dan dibahas tuntas pada chapter berikutnya. - Baris 17 (
kosong := []int{}): literal nol elemen menghasilkan slice kosong yang tercetak[]denganlen0. - Baris 21 (
var belum []float64): deklarasi tanpa nilai menghasilkan slice nil; tampilannya juga[]sehingga pembaca perlu memakai pembanding== niluntuk 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 #
- Go Blog: Arrays, slices (and strings): The mechanics of append — dasar resmi konsep slice.
- Spesifikasi Go: Slice types — definisi tipe slice dan notasi pemotongan.
- A Tour of Go: More types — latihan interaktif slice.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
slice-demo.go
Unduh berkaspackage 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))
}