Berbeda dengan array, dengan slice kita bisa mengelompokkan data berapapun yang kita inginkan tanpa harus menentukan panjang datanya. Selain itu panjang jumlah datanya tidak menenentukan jenis slice karena ukuran slice bisa bermacam -macam, yang menentukan jenis slice hanyalah tipe data yang akan dipopulasikan.
Mendefinisikan dan Mengelompokkan Data Menggunakan Slice
Cara untuk mendefinisikan slice adalah dengan menggunakan fungsi make
, dengan argumen tipe data dan panjang jumlah data yang digunakan.
package main
import "fmt"
func main() {
nilai := make([]int, 3)
nilai[0] = 90
nilai[1] = 60
nilai[2] = 70
fmt.Println(nilai)
}
Menggunakan Sintak Literal
Sintak literal untuk mendefinisikan slice sama dengan array, dan jumlah ukuran datanya mengikuti jumlah nilai literalnya.
package main
import "fmt"
func main() {
nilai := []int{90, 60, 70}
fmt.Println(nilai)
}
Menambahkan elemen ke slice
Keuntungan menggunakan slice yaitu dapat leluasa menambahkan elemen karena penjang jumlah datanya lebih dinamis. Fungsi append
dapat digunakan untuk menambahkan satu atau lebih dari satu data ke dalam slice dipisahkan menggunakan koma.
package main
import "fmt"
func main() {
nilai := []int{90, 60, 70}
nilai = append(nilai, 50, 80)
fmt.Println(nilai)
}
Setiap slice memiliki backing array, tetapi slice datanya independen. Contoh berikut menunjukkan bahwa merubah suatu slice tidak merubah slice lain.
package main
import "fmt"
func main() {
nilai1 := []int{90, 60, 70}
nilai2 := nilai1
nilai3 := append(nilai1, 3, 4)
nilai1[0] = 80
fmt.Println("Nilai 1:", nilai1)
fmt.Println("Nilai 2:", nilai2)
fmt.Println("Nilai 2:", nilai3)
}
Hasil output:
Nilai 1: [80 60 70]
Nilai 2: [80 60 70]
Nilai 3: [90 60 70 3 4]
Dari hasil program diatas menunjukkan bahwa nilai1
dan nilai2
memiliki backing array yang sama sehingga ketika nilai1
dirubah nilai2 juga ikut berubah, namun slice nilai1
dan nilai3
masing-masing adalah slice yang independen, sehingga ketika nilai1
berubah, nilai3
tidak berubah.
Menentukan Kapasitas Slice
Jika ingin membatasi jumlah item pada slice, kita bisa menentukan kapasitas ketika menggunakan fungsi make
.
Seperti yang di sebutkan sebelumnya panjang data adalah jumlah data yang saat ini digunakan, sedangkan kapasitas adalah jumlah data yang dapat disimpan dalam slice tersebut.
package main
import "fmt"
func main() {
nama := make([]string, 2, 5)
nama[0] = "Peci"
nama[1] = "Blangkon"
fmt.Println("nama :", nama)
fmt.Println("Jumlah :", len(nama))
fmt.Println("Kapasitas :", cap(nama))
}
Menggabungkan dua atau lebih Slice
Fundi append tidak hanya untuk menambahkan nilai kedalam slice tapi juga menggabungkan dua slice atau lebih.
Untuk menggabungkan slice, pada argumen append()
, slice kedua dan setelahnya yang akan digabungkan harus diikuti dengan tanda titik tiga (...
). Hal ini dikarenakan built-in append()
adalah untuk menambahkan nilai, jadi jika kita memberi nama arraynya saja, maka akan muncul pesan error ketika dikompile.
package main
import "fmt"
func main() {
buah := make([]string, 2, 5)
buah[0] = "Semangka"
buah[1] = "Durian"
buahLain := []string{"Jambu", "Mangga"}
buahBuahan := append(buah, buahLain...)
fmt.Println("buah :", buah)
fmt.Println("buahLain :", buahLain)
fmt.Println("buahBuahan :", buahBuahan)
}
Membuat Slice dari Array
Slice dapat dibuat menggunakan nilai yang telah dikelompokkan menggunakan array.
Berikut contoh membuat slice pada variabelseringDibeli
kita menyalin data dari array produk
degan menggunakan jangkauan antara data kedua sampai data keempat. Sedangkan variabel stok
menyalin semua data array untuk dijadikan slice.
package main
import "fmt"
func main() {
produk := [5]string{"Topi", "Baju", "Kaos", "Celana", "Jas Hujan"}
seringDibeli := produk[1:4]
stok := produk[:]
fmt.Println("Produk yang sering dibeli:", seringDibeli)
fmt.Println("Persediaan :", stok)
}
Menentukan Kapasitas Saat Membuat Slice Dari Array
Jangkauan juga dapat digunakan untuk menentukan jangkauan kapasitas maksimum slice yang akan dibuat ketika membuat slice dari array.
Contoh pada program berikut variabel seringDibeli
, kita membuat slice dari array menggunakan jangkauan data kedua hingga data ketiga, dan menentukan maksimum kapasitas dari elemen kedua hingga elemen ke lima.
package main
import "fmt"
func main() {
produk := [5]string{"Topi", "Baju", "Kaos", "Celana", "Jas Hujan"}
seringDibeli := produk[1:3:5]
stok := produk[:]
fmt.Printf("produk %v jumlahnya %d dan kapasitasnya %d\n",
produk, len(produk), cap(produk))
fmt.Printf("seringDibeli %v jumlahnya %d dan kapasitasnya %d\n",
seringDibeli, len(seringDibeli), cap(seringDibeli))
fmt.Printf("stok %v jumlahnya %d dan kapasitasnya %d\n",
stok, len(stok), cap(stok))
}
Jika program dijalankan maka kapasitas slice seringDibeli adalah 4, dikarenakan jangkauannya dimulai dari elemen kedua pada array hingga kelima.
produk [Topi Baju Kaos Celana Jas Hujan] jumlahnya 5 dan kapasitasnya 5
seringDibeli [Baju Kaos] jumlahnya 2 dan kapasitasnya 4
stok [Topi Baju Kaos Celana Jas Hujan] jumlahnya 5 dan kapasitasnya 5
Menggunakan Fungsi copy()
Fungsi copy()
menyalin elemen antar dua slice. Fungsi ini akan memastikan slice memiliki kapasitas yang cukup untuk menyalin data dari slice lain.
package main
import "fmt"
func main() {
produk := [5]string{"Topi", "Baju", "Kaos",
"Celana", "Jas Hujan"}
stok := produk[2:]
dijual := make([]string, 2)
copy(dijual, stok)
fmt.Printf("produk = %v\n", produk)
fmt.Printf("stok = %v\n", stok)
fmt.Printf("dijual = %v\n", dijual)
}
Menyalin Slice dengan ukuran yang berbeda
Jika slice tujuan ukurannya lebih besar daripada slice yang akan disalin, maka penyalinan akan dilakukan hingga elemen akhir slice yang disalin.
Berikut contoh penyalinan berhenti hingga akhir elemen slice produkPengganti
.
package main
import "fmt"
func main() {
produk := []string{"Topi", "Baju", "Kaos",
"Celana", "Jas Hujan"}
produkPengganti := []string{"Sepatu", "Tas"}
copy(produk, produkPengganti)
fmt.Printf("produk = %v\n", produk)
}
Menghapus Elemen Slice
Untuk menghapus elemen pada slice kita bisa memanfaatkan jangkauan ketika menggunakan fungsi append()
.
package main
import "fmt"
func main() {
produk := []string{"Topi", "Baju", "Kaos",
"Celana", "Jas Hujan"}
hapusIndex := 2
fmt.Println("Produk yang di hapus :", produk[hapusIndex])
produk = append(produk[:hapusIndex],
produk[hapusIndex+1:]...)
fmt.Printf("produk = %v\n", produk)
}
Mengurutkan Slice
Untuk mengurutkan data pada slice, kita dapat menggunakan standar librari dalam paket sort
yang mendefinisikan beberapa fungsi untuk mengurutkan beberapa jenis slice.
Contoh program berikut mengurutkan slice berjenis string menggunakan fungsi sort.Strings()
.
package main
import (
"fmt"
"sort"
)
func main() {
produk := []string{"Topi", "Baju", "Kaos",
"Celana", "Jas Hujan"}
fmt.Printf("produk = %v\n", produk)
sort.Strings(produk)
fmt.Printf("urutan = %v\n", produk)
}
Membandingkan Slice
Berbeda dengan array, slice hanya dibandingkan dengan nilai nil
, membandingkan antar dua slice akan menampikan pesan error.
Cara lain untuk membandingkan slice adalah dengan menggunakan fungsi DeepEqual()
yang disediakan pada standar librari dengan nama paket reflect
package main
import (
"fmt"
"reflect"
)
func main() {
produk := []string{"Topi", "Baju", "Kaos", "Celana", "Jas Hujan"}
stok := produk[:]
sama := reflect.DeepEqual(produk, stok)
fmt.Printf("produk dan stok adalah slice yang sama: %v\n", sama)
}
Menggunakan array dari sebuah slice
Jika kita membutuhkan array, misalnya untuk digunakan pada sebuah fungsi yang hanya dapat menggunakan array, maka kita bisa mengkonversi slice secara eksplisit menjadi array menggunakan pointer.
package main
import (
"fmt"
)
func main() {
produk := []string{"Topi", "Baju", "Kaos", "Celana", "Jas Hujan"}
produkArray := (*[3]string)(produk)
fmt.Println("Produk :", produk)
fmt.Println("ProdukArray :", *produkArray)
}
Hal yang diperhatikan saat menentukan tipe array yang akan dibuat selain tipe data array, jumlah elemen bisa kurang atau sama dengan slice yang disalin, tetapi tidak boleh melebihi jumlah elemen pada slice.