Pada slice kita dapat menggunakan kode-kode di atas.
Sepertihalnya array, slice pun dapat menggunakan len()
, tentu untuk membaca panjang dari slice tersebut.
cap()
selanjutnya cap()
, pada array kita menuliskan alokasi data saat deklarasi, atau pada deklarasi sekaligus inisialisasi kita dapat menulis ...
, yang intinya pada array aloksai data terbentuk saat deklarasi.
Lantas bagaimana dengan slice?
Sebenarnya secara default kita mempunyai alokasi / kapasitas sama dengan panjang. Bila slice tersebut adalah slice yang dibuat sendiri.
Bila slice tersebut dibuat dari meng-copy data yang ada, maka terdapat 2 kondisi.
var kelas1 = []string{
"Andi",
"Fatah",
"Budi",
"Agung",
}
fmt.Println(len(kelas1)) // akan menghasilkan nilai 4
fmt.Println(cap(kelas1)) // akan menghasilkan nilai 4
kode | output | cap() |
---|---|---|
kelas1[0:2] | [“Andi”, “Fatah”, ---, ---] | 4 |
kelas1[1:3] | [“Fatah”, “Budi”, ---] | 3 |
- Bila indexStart adalah 0, maka kapasitas mengikuti kapasitas yang ada.
- Bila indexStart lebih dari 0, maka kapasitas dipotong dari 0 ke indexStart.
Intinya dipotong di depan
append()
selanjutnya append()
, digunakan untuk menambahkan item ke dalam slice, tentu masuk paling belakang, yang selanjutnya menghasilkan slice baru yang sudah ditambahkan.
Berikut kondisi yang perlu diingat.
- Bila panjang dan kapasitasnya sama, maka data yang ditambahkan akan membentuk referensi item baru.
- Bila kapasitas lebih dari panjangnya, maka data dengan referensi yang sama akan berubah?
Ha??? Gimana gimana??? OK, TKP
var kelas1 = []string{
"Andi",
"Fatah",
"Budi",
"Agung",
}
var naikKelas2 = kelas1[0:3]
fmt.Println(1, kelas1) // 1 [Andi Fatah Budi Agung]
fmt.Println(2, naikKelas2) // 2 [Andi Fatah Budi]
naikKelas2[1] = "Lucinta"
fmt.Println(2, naikKelas2) // 2 [Andi Lucinta Budi]
fmt.Println(2, "panjang:", len(naikKelas2), "kapasitas:", cap(naikKelas2))
// 2 panjang: 3 kapasitas: 4
var naikKelas3 = append(naikKelas2, "Dika")
// kode di atas akan membuat "Agung" berubah
fmt.Println(1, kelas1) // 1 [Andi Lucinta Budi Dika] "Agung" berubah
fmt.Println(2, naikKelas2) // 2 [Andi Lucinta Budi]
fmt.Println(3, naikKelas3) // 3 [Andi Lucinta Budi Dika]
"Agung"
kini telah berubah, dia tak seperti dahulu saat pertama ku mengenalnya.
Anyway intinya dia berubah, karena “Dika” masuk pada refernce / alamat memori “Agung” / index-3, yang mana masih di dalam kapasitas slice tersebut
Berbeda dengan kondisi ini
fmt.Println(3, "panjang:", len(naikKelas3), "kapasitas:", cap(naikKelas3))
// 3 panjang: 4 kapasitas: 4
var naikKelas4 = append(naikKelas3, "Onik")
fmt.Println(1, kelas1) // 1 [Andi Lucinta Budi Dika]
fmt.Println(2, naikKelas2) // 2 [Andi Lucinta Budi]
fmt.Println(3, naikKelas3) // 3 [Andi Lucinta Budi Dika]
fmt.Println(4, naikKelas4) // 4 [Andi Lucinta Budi Dika Onik]
“Onik” tidak merubah apapun, dia masuk sebagai reference baru, karena di luar kapasitas yang ada, jadi kelas-nya beli kursi baru.
copy()
seperti namanya, ini digunakan untuk meng-copy. Berbeda cara kita meng-copy slice dengan metode 2 index yang sudah kita bahas pada artikel sebelumnya.
Pada metode 2 index kita meng-copy semua nya, dengan referensi yang sama.
Dengan copy()
, kita hanya meng-copy nilainya, namun dengan referensi yang baru, dan akan mengembalikan panjang hasil copy
Dengan format
copy(tujuan, asal)
Yang perlu diingat pada metode ini adalah
- Jika panjang
asal
<= kapasitastujuan
, maka akan di-copy semua - Jika panjang
asal
> kapasitastujuan
, maka hanya di-copy sesuai kapasitas.
var kelas1 = []string{
"Andi",
"Fatah",
"Budi",
"Agung",
}
var kelas5 = make([]string, 3)
n := copy(kelas5, kelas1)
fmt.Println(kelas1) // [Andi Lucinta Budi Dika]
fmt.Println(kelas5, n) // [Andi Lucinta Budi] 3
kelas5[0] = "Hoho"
kelas6 := append(kelas5, "Appan")
fmt.Println(kelas1) // [Andi Lucinta Budi Dika]
fmt.Println(kelas5, n) // [Hoho Lucinta Budi] 3
fmt.Println(kelas6) // [Hoho Lucinta Budi Appan]
NB: 3 indeks
Kita sudah belajar 1 index untuk akses item, 2 index untuk copy slice,
Nah sekarang kita bahas *3 index. Pada dasarnya metode ini hampir sama seperti 2 index. Bahkan, sebenarnya sama. Hanya saja, index ke-3 adalah tempat kita menentukan kapasitasnya.
Di atas sudah dibahas bahwa kapasitas slice hasil copy secara default menyesuaikan dengan kapasitas asalnya.
Nah kita dapat menentukannya dengan ini
var kelas1 = []string{
"Andi",
"Fatah",
"Budi",
"Agung",
}
var kelas2A = kelas1[0:3]
var kelas2B = kelas1[0:3:3]
fmt.Println(kelas2A, len(kelas2A), cap(kelas2A))
// [Andi Lucinta Budi] 3 4
fmt.Println(kelas2A, len(kelas2A), cap(kelas2A))
// [Andi Lucinta Budi] 3 3
Demikian artikel kali ini, Terima kasih.