Slice merupakan tipe data reference di Golang yang hampir mirip dengan array. Perbedaanya tidak perlu ada length declaration seperti array. Kelebihan dari slice yaitu tidak perlu mendefinisikan berapa banyak value yang akan ditampung dalam data. Sementara kekurangan dari slice yaitu saat di inputkan value yang melebihi capasitas slice, maka capasitas slice akan menjadi 2 kali lipat.
Membuat Slice dari Array
Slice dapat dibuat dengan mengambil value dari suatu array seperti contoh di bawah ini.
Make digunakan untuk membuat suatu slice. Fungsi make memiliki 3 input parameter yaitu tipe data, length dan capacity. Capacity harus lebih dari length (capacity > length). Capacity ibaratkan beberapa kotak untuk menyimpan suatu nilai, sementara length dapat diartikan berapa kotak yang sudah diisi suatu nilai. Make akan mengisi capacity dari suatu slice dengan default value dari tipe data yang digunakan.
Contoh Code Deklarasi Slice dengan Capacity > Length
panic: runtime error: index out of range [5] with length 5
Kekurangan Slice
Saat kita menginputkan suatu value ke dalam slice yang melebihi length dari slice, capacity dari slice tersebut akan menjadi 2 kali lipatnya. Cotohnya seperti code dibawah ini. Slice s yang awalnya tidak mempunyai value, kemudian di isi value secara bertahap menggunakan looping. Lalu di tampilkan kapasitas dan length dari slice tersebut.
packagemainimport"fmt"funcmain() { s :=make([]int, 0, 3) fmt.Println(s)for i :=0; i <20; i++ { s =append(s, i) fmt.Printf("cap %v, len %v, %p\n", cap(s), len(s), s) }}
[]
cap 3, len 1, 0xc000018018
cap 3, len 2, 0xc000018018
cap 3, len 3, 0xc000018018
cap 6, len 4, 0xc000014270
cap 6, len 5, 0xc000014270
cap 6, len 6, 0xc000014270p
cap 12, len 7, 0xc00005e060
cap 12, len 8, 0xc00005e060
cap 12, len 9, 0xc00005e060
cap 12, len 10, 0xc00005e060
cap 12, len 11, 0xc00005e060
cap 12, len 12, 0xc00005e060
cap 24, len 13, 0xc00007a000
cap 24, len 14, 0xc00007a000
cap 24, len 15, 0xc00007a000
cap 24, len 16, 0xc00007a000
cap 24, len 17, 0xc00007a000
cap 24, len 18, 0xc00007a000
cap 24, len 19, 0xc00007a000
cap 24, len 20, 0xc00007a000
Add Value
Untuk menambahkan value dalam suatu slice dapat menggunakan fungsi append.
packagemainimport"fmt"funcmain() { a := []int{1,2,3,4,5} a =append(a, 6) fmt.Println(a)}
[1 2 3 4 5 6]
Update Value
Untuk memperbaruhi value dengan index tertentu dari suatu slice, dapat langsung diubah seperti contoh di bawah ini.
packagemainimport"fmt"funcmain() { a := [5]int{1,2,3,4,5} a[2] =10 fmt.Println(a)}
[1 2 10 4 5]
Delete Value
Untuk menghapus suatu value dengan index tertentu di slice dapat menggunakan fungsi append. Dimana append memiliki format append(slice, ...value). Parameter kedua dalam fungsi append merupakan variadic function, yang berarti append dapat menerima lebih dari 2 input.
packagemainimport"fmt"funcmain() { a := []int{1,2,3,4,5} a =append(a[:2], a[2+1:]...) fmt.Println(a)}
[1 2 4 5]
Kodingan di atas sama memiliki algoritma yang sama dengan kodingan di bawah ini :
packagemainimport"fmt"funcmain() { a := []int{1,2,3,4,5} a =append(a[:2], []int{4,5}...) fmt.Println(a)}
packagemainimport"fmt"funcmain() { a := []int{1,2,3,4,5} a =append(a[:2], 4, 5) fmt.Println(a)}
Informasi tambahan
Suatu slice misalkan s akan disimpan dengan memory address yang berbeda dengan value-value di dalam slice tersebut.
packagemainimport"fmt"funcmain() { s :=make([]int, 0, 3)for i :=0; i <5; i++ { s =append(s, i) fmt.Printf("cap %v, len %v, %p\n", cap(s), len(s), s)for i :=range s { val :=&i fmt.Println(val) } }}
cap 3, len 1, 0xc000018018
0xc00001a050
cap 3, len 2, 0xc000018018
0xc00001a058
0xc00001a058
cap 3, len 3, 0xc000018018
0xc00001a060
0xc00001a060
0xc00001a060
cap 6, len 4, 0xc000014270
0xc00001a068
0xc00001a068
0xc00001a068
0xc00001a068
cap 6, len 5, 0xc000014270
0xc00001a070
0xc00001a070
0xc00001a070
0xc00001a070
0xc00001a070