Slices
Pada sesi ini kita akan membahas penggunaan dari Slices pada Go
Last updated
Pada sesi ini kita akan membahas penggunaan dari Slices pada Go
Last updated
Pada GO, ukuran Array sudah fix ditetapkan sejak awal deklarasi sebuah variabel dan nilai. Jadi tidak bisa menambahkan data diluar ukuran panjang dari Array. Slice lebih sering digunakan jika kita ingin ukuran elemen yang dinamis.
Statemen []T
adalah sebuah slice dengan elemen bertipe T
.
Slice terdiri dari 2 range yang berbentuk seperti berikut ini:
Slice menampilkan data dari elemen pertama dan seterusnya sesuai interval atau range yang ada kecuali elemen terakhir yaitu nilai dari high
. Statemen berikut ini membuat slice yang terhitung dari elemen indeks 1 sampai 3 dari Slice a
:
Contoh lainnya bisa dilihat seperti kode di bawah ini:
Slice adalah reference elemen array. Slice bisa dibuat atau bisa juga dihasilkan dari manipulasi sebuah array ataupun slice lainnya.Hal ini menjadikan perubahan data di tiap elemen slice akan berdampak pada slice lain yang memiliki alamat memori yang sama.
Menggunakan slice mirip seperti array, bedanya tidak perlu mendefinisikan jumlah elemen ketika awal deklarasi:
A slice tidak menyimpan suatu data. Sebenarnya slice dan array tidak bisa dibedakan karena merupakan sebuah kesatuan. Array adalah kumpulan nilai atau elemen, sedang slice adalah referensi tiap elemen tersebut.
Jika ada slice baru yang terbentuk dari slice lama, maka data elemen slice yang baru akan memiliki alamat memori yang sama dengan elemen slice lama. Setiap perubahan yang terjadi di elemen slice baru, akan berdampak juga pada elemen slice lama yang memiliki referensi yang sama.
Kita bisa melihat pada output di atas, elemen yang sebelumnya bernilai "Guntur"
pada variabel students
, aStudents
, bStudents
, aaStudents
, dan baStudents
; semuanya berubah menjadi "David"
, karena memiliki referensi yang sama.
Slice memiliki panjang dan kapasitas. Length ditandai dengan expression len(s)
dan Capacity ditandai dengan expression cap(s)
.
Lalu apa perbedaannya?
Fungsi len(s)
digunakan untuk menghitung jumlah elemen slice yang ada. Sebagai contoh jika sebuah variabel adalah slice dengan data 6 buah, maka fungsi ini pada variabel tersebut akan mengembalikan angka 6. Mari kita lihat kode di bawah ini:
Fungsi cap(s) adalah jumlah panjang elemen yang dihitung dari elemen pertama dari Slice. Kita lihat kode di bawah ini:
Loh, lalu dimana perbedaan antara len(s)
dan cap(s)
? Mari kita lihat contoh yang lebih kompleks:
Mari kita analisis output di atas menggunakan tabel di bawah ini:
Kode
Output
len()
cap()
s[0:6]
[1
3
5
7
9
11
]
6
6
s[0:4]
[1
3
5
7
----
----
]
4
6
s[0:3]
[1
3
5
----
----
----
]
3
6
s[2:4]
----
----
[5
7
----
----
]
2
4
Kita analogikan proses slicing 2 index menggunakan x dan y.
Slicing yang dimulai dari indeks 0 hingga y akan mengembalikan elemen-elemen mulai indeks 0 hingga sebelum indeks y, dengan lebar kapasitas adalah sama dengan slice aslinya.
Sedangkan slicing yang dimulai dari indeks x, dimana nilai x adalah lebih dari 0, membuat elemen ke-x slice yang diambil menjadi elemen ke-0 slice baru. Hal inilah yang membuat kapasitas slice berubah.
append()
append()
adalah built-in function dari Go untuk menambahkann elemen baru pada Slice. append()
memiliki format expression sepert ini:
Parameter pertama slice []Type
adalah sebuah slice bertipe T
, parameter kedua elems
adalah nilai elemen untuk ditambahkan ke dalam slice.
Kita lihat di atas untuk nilai elemen sudah sesuai yaitu ditambahkannya nilai baru ke dalam slice.
fungsi append()
akan menambahkan nilai elemen baru ke dalam Slice di akhir elemen
Ada 2 hal yang perlu diperhatikan dari penggunaan append()
:
Ketika jumlah elemen dan lebar kapasitas adalah sama (len(s) == cap(s)
), maka elemen baru hasil append()
merupakan referensi baru dan value dari capacity cap(s)
akan dikalikan 2.
Ketika jumlah elemen lebih kecil dibanding kapasitas (len(fruits) < cap(fruits)
), elemen baru tersebut ditempatkan ke dalam cakupan kapasitas, menjadikan semua elemen slice lain yang referensi-nya sama akan berubah nilainya.
Kita lihat lebih detail pada kode di bawah ini:
Kita bisa lihat di atas bahwa saat sebelum dilakukan append()
, nilai dari cap(s)
sama dengan len(s)
yaitu 4
, sehingga setelah dilakukan proses append()
, nilai dari cap(s)
akan dikalikan 2.
Lalu kita akan melihat untuk kondisi yang kedua:
Pada slice t
data berisi nilai slice dari variabel s
yaitu:
Kode
Output
len()
cap()
s[0:3]
[1
3
5
----
----
----
----
----
]
3
8
Sebelum menggunakan append()
pada variabel t
, terdapat panjang elemen yaitu 3
dan kapasitas yang lebih besar dari panjang nilai elemen yaitu 8
sehingga elemen baru tersebut yaitu 17
ditempatkan ke dalam cakupan kapasitas dari variabel t
, menjadikan semua elemen slice lain yang referensi-nya sama akan berubah nilainya.
make()
Kita dapat membuat Slice menggunakan fungsi built-in dari Go yaitu make
.
Fungsi make
membuat Array kosong dan mengembalikan nilai Slice yang mereference ke dalam Array tersebut. Untuk menuliskan jumlah kapasitas kita bisa tambahkan pada argumen ketiga: