Array vs Slice di Golang: Perbedaan, Cara Kerja & Penggunaan

Ringkasan
- Array memiliki ukuran tetap (fixed-length) yang menjadi bagian dari tipe datanya, cocok untuk data yang jumlahnya pasti.
- Slice adalah struktur dinamis yang bertindak sebagai jendela (view) ke array, memungkinkan penambahan data secara fleksibel melalui fungsi
append().- Efisiensi Memori: Array dikirim sebagai salinan utuh (value type), sedangkan slice dikirim sebagai header ringan (reference type), membuatnya jauh lebih efisien untuk data besar.
- Kapan Memilih: Gunakan slice untuk hampir semua kasus umum di Go, dan gunakan array hanya untuk optimasi tingkat rendah atau buffer berukuran tetap.
Bagi banyak pengembang yang baru berpindah ke bahasa pemrograman Go (Golang), perbedaan antara Array dan Slice seringkali membingungkan. Sekilas, keduanya terlihat identik karena sama-sama digunakan untuk menyimpan kumpulan data bertipe sama dalam satu variabel. Namun, di balik layar, mekanisme manajemen memori dan perilakunya sangat berbeda.
Memahami perbedaan mendalam antara keduanya bukan sekadar masalah sintaksis, melainkan masalah performa. Salah memilih struktur data dapat menyebabkan penggunaan memori yang boros atau bug yang sulit dilacak saat aplikasi Anda berkembang menjadi sistem skala besar.
Apa Itu Array di Golang?
Array adalah struktur data yang menyimpan sekumpulan elemen dengan tipe yang sama dan memiliki ukuran yang tetap (fixed-length). Sekali Anda mendeklarasikan array dengan ukuran tertentu, ukuran tersebut tidak dapat diubah selama program berjalan.
Karakteristik Utama Array
Salah satu hal paling unik dari array di Go adalah bahwa ukuran array merupakan bagian dari tipe datanya. Ini berarti [5]int dan [10]int adalah dua tipe data yang sepenuhnya berbeda. Anda tidak bisa memasukkan array berukuran 5 ke dalam variabel yang mengharapkan array berukuran 10.
Contoh Deklarasi Array:
// Deklarasi array dengan ukuran 5
var arr [5]int
arr[0] = 10
// Inisialisasi langsung (Literal)
arrLiteral := [5]int{10, 20, 30, 40, 50}
Kapan Harus Menggunakan Array?
Karena sifatnya yang kaku, array jarang digunakan dalam pengembangan aplikasi bisnis sehari-hari. Namun, array sangat berguna dalam skenario berikut:
- Buffer Berukuran Tetap: Misalnya saat membaca data dari network socket dengan ukuran paket yang sudah ditentukan.
- Kriptografi: Banyak algoritma hashing (seperti SHA-256) yang menghasilkan output dengan panjang byte yang tetap.
- Optimasi Memori Tingkat Rendah: Ketika Anda ingin menghindari alokasi memori dinamis di heap untuk mengurangi beban Garbage Collector (GC).
Apa Itu Slice di Golang?
Slice adalah versi fleksibel dari array. Secara teknis, slice bukanlah array itu sendiri, melainkan sebuah deskriptor atau pembungkus (wrapper) yang merujuk ke sebuah array yang ada di latar belakang (underlying array). Slice memberikan cara yang jauh lebih efisien dan mudah untuk mengelola urutan data.
Anatomi Internal Slice
Sebuah slice terdiri dari tiga komponen utama yang disimpan dalam sebuah struktur kecil (slice header):
- Pointer: Alamat memori yang menunjuk ke elemen pertama array yang dapat diakses oleh slice tersebut.
- Length (Panjang): Jumlah elemen yang saat ini ada di dalam slice.
- Capacity (Kapasitas): Jumlah total elemen yang dapat ditampung oleh array di belakang slice, mulai dari pointer awal hingga akhir array tersebut.
Contoh Deklarasi Slice:
// Deklarasi slice (tanpa angka di dalam kurung siku)
slice := []int{10, 20, 30}
// Menambahkan elemen secara dinamis
slice = append(slice, 40, 50)
Mekanisme Fungsi append()
Fungsi append() adalah jantung dari fleksibilitas slice. Saat Anda menambahkan elemen baru, Go akan memeriksa apakah kapasitas (capacity) masih mencukupi. Jika masih ada ruang, Go hanya akan menambah panjang (length) dan memasukkan data baru.
Namun, jika kapasitas sudah penuh, Go akan melakukan proses berikut secara otomatis:
- Membuat array baru yang lebih besar (biasanya dua kali lipat dari ukuran sebelumnya).
- Menyalin semua data dari array lama ke array baru.
- Menambahkan elemen baru ke array tersebut.
- Memperbarui pointer slice untuk merujuk ke array baru ini.
Perbandingan Mendalam: Array vs Slice
1. Pengiriman ke Fungsi (Pass by Value vs Reference)
Ini adalah perbedaan yang paling krusial bagi performa aplikasi. Di Go, segala sesuatu dikirim sebagai value. Namun, karena array adalah tipe nilai murni, saat Anda mengirim array ke fungsi, Go akan menyalin seluruh isi array tersebut. Jika array Anda berisi 1 juta elemen, maka 1 juta elemen tersebut akan disalin ke memori baru.
Sebaliknya, saat Anda mengirim slice, yang dikirim hanyalah slice header (pointer, length, dan capacity). Karena hanya header kecil yang disalin, proses ini sangat cepat dan efisien, tidak peduli seberapa besar data yang ada di dalam slice tersebut.
2. Fleksibilitas Ukuran
Array bersifat statis. Jika Anda membutuhkan lebih banyak ruang, Anda harus membuat array baru dan menyalin datanya secara manual. Slice bersifat dinamis; ia dapat tumbuh dan menyusut sesuai kebutuhan aplikasi Anda melalui fungsi append() atau teknik reslicing.
Tabel Perbandingan Ringkas
| Aspek | Array | Slice |
|---|---|---|
| Ukuran | Tetap (Fixed) | Dinamis |
| Deklarasi | [5]int |
[]int |
| Pertumbuhan | Tidak bisa bertambah | Bisa (via append()) |
| Pengiriman Fungsi | Disalin seluruhnya (Berat) | Hanya header (Ringan) |
| Tipe Data | Ukuran adalah bagian dari tipe | Tipe umum untuk koleksi data |
| Penggunaan | Kasus khusus/Optimasi | Sangat sering (Standar Go) |
Tips Praktis dalam Menggunakan Slice
Untuk menulis kode Go yang lebih profesional dan efisien, pertimbangkan tips berikut:
Gunakan make() untuk Pre-alokasi
Jika Anda sudah mengetahui perkiraan jumlah data yang akan masuk ke dalam slice, gunakan fungsi make() untuk menentukan kapasitas awal. Ini mencegah Go melakukan alokasi ulang memori berkali-kali saat fungsi append() dipanggil.
// Kurang efisien: alokasi terjadi berulang kali
var data []int
for i := 0; i < 1000; i++ {
data = append(data, i)
}
// Lebih efisien: alokasi memori dilakukan sekali di awal
data := make([]int, 0, 1000)
for i := 0; i < 1000; i++ {
data = append(data, i)
}
Hati-hati dengan Memory Leak pada Reslicing
Karena slice merujuk ke array di belakangnya, jika Anda membuat slice kecil dari array yang sangat besar, array besar tersebut akan tetap berada di memori selama slice kecil itu masih digunakan. Untuk mengatasinya, Anda bisa menyalin data yang dibutuhkan ke slice baru menggunakan fungsi copy().
Kesimpulan
Array dan slice mungkin terlihat mirip, tetapi mereka melayani tujuan yang berbeda. Array memberikan kepastian dan kontrol ketat atas memori, sementara slice memberikan fleksibilitas dan kemudahan pengembangan.
Bagi pengembang Go, aturan praktisnya sederhana: Gunakan slice untuk hampir semua hal. Gunakan array hanya jika Anda memiliki alasan teknis yang sangat spesifik terkait ukuran data yang tidak boleh berubah atau kebutuhan optimasi memori tingkat rendah. Dengan menguasai konsep length, capacity, dan cara kerja underlying array, Anda akan dapat mengelola koleksi data di Go dengan jauh lebih efektif dan efisien.
Solusi yang relevan
Jasa Pembuatan Website
Pembuatan website custom yang cepat, modern, dan siap jualan.
Related Articles

Oracle Cuts 21,000 Jobs to Fund Massive AI Infrastructure
Oracle has slashed 21,000 jobs—13% of its workforce—to fund a massive pivot toward AI infrastructure. Despite record growth, the company is trading human capital for AI compute power.

Cara Website Bisnis Mudah Ditemukan di Google (SEO)
Website sepi pengunjung? Pelajari cara agar website bisnis Anda mudah ditemukan di halaman pertama Google dengan strategi SEO dasar yang ampuh dan praktis.

Tutorial SSE (Server-Sent Events): Solusi Real-time Efisien
Pelajari cara mengimplementasikan Server-Sent Events (SSE) untuk membangun sistem antrian real-time yang efisien. Temukan mengapa SSE lebih unggul dari WebSocket untuk komunikasi satu arah.

Kupas Tuntas Percabangan Golang: If-Else dan Switch Case
Pelajari cara mengoptimalkan logika program di Golang dengan fitur If Short Statement dan Switch Case yang efisien. Temukan tips menulis kode yang bersih, aman, dan idiomatik!
Dapatkan Artikel Terbaru!
Berlangganan newsletter kami untuk mendapatkan tips dan insight menarik langsung ke inbox Anda.
Kami tidak akan pernah membagikan email Anda (No Spam).