Mastering Golang
  • Tentang Go
  • Instalasi Go
  • Membuat Project Go
  • Go Run & Go Build
  • Apa itu Package pada Go
  • Imports dan Exports
  • Variabel
  • Tipe Data
  • Konstanta dan Komentar
  • Operator
  • Type Conversion
  • Kondisional - IF
  • Kondisional - Switch Case
  • Looping
  • Array
  • Array - Looping
  • Slices
  • Pointer
  • Map
  • Fungsi
  • Struct
  • Method
  • Interface
  • Interface Kosong
  • Concurrency
  • Concurrency - Goroutines
  • Channel
  • Buffered Channel
  • Channel - Close and Range
  • Channel - Direction
  • Channel - Select
  • Concurrency - WaitGroup
  • Concurrency - Mutex
  • JSON Data
  • SQL
  • URL Parsing
  • GO Vendor
  • Unit Testing
  • Go Basic for Web Development
    • Aplikasi Web pada Go - Hello World
    • Root Routing
    • Query String
    • Web Service API Server
    • HTTP Basic Auth
    • RESTFul API dengan Gin dan Gorm
Powered by GitBook
On this page
  • Slice Merupakan Tipe Data Reference
  • Slice length and capacity
  • Fungsi append()
  • Membuat slice menggunakan make()

Was this helpful?

Slices

Pada sesi ini kita akan membahas penggunaan dari Slices pada Go

PreviousArray - LoopingNextPointer

Last updated 4 years ago

Was this helpful?

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:

a[low:high]

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:

a[1:4]

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:

Slice Merupakan Tipe Data Reference

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 length and capacity

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.

s[x: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.

Fungsi append()

append() adalah built-in function dari Go untuk menambahkann elemen baru pada Slice. append()memiliki format expression sepert ini:

append(slice []Type, elems ...Type) []T

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.

Membuat slice menggunakan make()

Kita dapat membuat Slice menggunakan fungsi built-in dari Go yaitu make .

a := make([]int, 5)  // len(a)=5

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:

b := make([]int, 0, 5) // len(b)=0, cap(b)=5

b = b[:cap(b)] // len(b)=5, cap(b)=5
b = b[1:]      // len(b)=4, cap(b)=4

Menampilkan data Slice yang ada pada indeks 1 sampai indeks ke 2
Indeks ke 3 yaitu nilai elemen 30 tidak ditampilkan
Membuat slice yang berisi nilai elemen dari students
Output program menampilkan elemen Slice
Illustrasi dari pengertian Slice sebagai tipe data reference
Output program menampilkan data Slice yang berubah
Penggunaan len() pada slice
Output program menampilkan jumlah panjang elemen pada slice
Penggunaan cap() pada slice
Output program menampilkan capacity dari slice
Melihat perbedaan antara len() dan cap()
Output program dari penggunaan len() dan cap() pada slice
Menambahkan elemen slice menggunakan fungsi append()
Output program setelah menggunakan fungsi append()
Melihat nilai len(s) dan cap(s) saat menggunakan append()
Nilai dari cap(s) dikalikan 2 karena nilai dari len(s) == cap()
Membuat variabel baru yaitu t dengan nilai dari slice s
Output program terlihat perubahan nilai elemen pada slice s dan t