Struktur Data
Meskipun bahasa Go memiliki sintaks yang sederhana, namun memiliki berbagai struktur data inti yang kuat. Struktur data ini adalah blok bangunan dasar untuk program Go. Memahami prinsip implementasi mereka akan membantu menulis kode yang lebih efisien. Artikel ini akan memperkenalkan beberapa struktur data yang paling umum digunakan di Go dan implementasi tingkat rendah mereka.
Struktur Data Dasar
slice Slice
Slice adalah struktur data yang paling umum digunakan di Go, merupakan abstraksi dan enkapsulasi dari array. Fitur utama:
- Ukuran Dinamis: Panjang slice dapat tumbuh secara dinamis
- Semantik Referensi: Saat slice diteruskan, hanya struktur yang disalin, bukan array tingkat rendah
- Mekanisme Ekspansi: Kapasitas akan diperluas secara otomatis ketika tidak cukup
Slice direpresentasikan oleh struktur slice di runtime, yang berisi pointer ke array tingkat rendah, panjang, dan kapasitas.
string String
String adalah salah satu tipe data paling dasar di Go, dengan fitur utama:
- Immutabilitas: Setelah string dibuat, tidak dapat dimodifikasi
- Encoding UTF-8: Biasanya merepresentasikan teks yang di-encode dengan UTF-8
- Keamanan Nilai Nol: Nilai nol string adalah string kosong
"", bukannil
String direpresentasikan oleh struktur stringStruct di runtime, yang berisi pointer ke array byte dan panjang.
Struktur Data Kontainer
map Tabel Pemetaan
map adalah kontainer pasangan kunci-nilai yang dibangun di Go, diimplementasikan menggunakan tabel hash. Fitur utama:
- Implementasi Tabel Hash: Menempatkan elemen dengan cepat melalui fungsi hash
- Ekspansi Otomatis: Memperluas secara otomatis ketika faktor beban terlalu tinggi
- Tidak Aman Secara Konkuren: Memerlukan mekanisme sinkronisasi tambahan untuk baca/tulis konkuren
map direpresentasikan oleh struktur hmap di runtime, yang berisi array bucket, seed hash, penghitung elemen, dan field lainnya.
syncmap Pemetaan Konkuren
sync.Map adalah pemetaan aman konkuren yang disediakan oleh pustaka standar, cocok untuk skenario dengan banyak baca dan sedikit tulis. Fitur utama:
- Pemisahan Baca/Tulis: Menggunakan dua map
readdandirtyuntuk memisahkan baca dan tulis - Operasi Atom:
readmap menggunakan operasi atom, tanpa perlu kunci - Migrasi Progresif: Ketika hitungan
missmencapai ambang batas,dirtydipromosikan menjadiread
sync.Map mengorbankan ruang untuk waktu, dan dalam skenario tertentu memberikan performa yang lebih baik daripada map + mutex.
Struktur Data Konkuren
channel Saluran
channel adalah representasi khas dari filosofi CSP di Go, digunakan untuk komunikasi antar goroutine. Fitur utama:
- Komunikasi Goroutine: Meneruskan data antar goroutine melalui channel
- Mekanisme Sinkronisasi: channel tanpa buffer dapat digunakan untuk sinkronisasi goroutine
- Antrian Berkunci: Tingkat rendah adalah antrian melingkar dengan kunci
channel direpresentasikan oleh struktur hchan di runtime, yang berisi buffer melingkar, antrian tunggu, dan field lainnya.
select Multipleksing
select dapat memantau status beberapa channel secara bersamaan,实现 multipleksing. Fitur utama:
- Non-blocking: Dapat memeriksa apakah beberapa channel tersedia secara non-blocking
- Pemilihan Acak: Ketika beberapa channel tersedia, satu dipilih secara acak untuk dieksekusi
- Kontrol Timeout: Dapat digunakan dengan
time.Afteruntuk mekanisme timeout
select direpresentasikan oleh struktur scase di runtime untuk setiap cabang, memeriksa status channel melalui mekanisme polling.
Saran Pembelajaran
Disarankan untuk belajar dengan urutan berikut:
- Pelajari slice Slice dan string String terlebih dahulu, pahami struktur data dasar
- Kemudian pelajari map Tabel Pemetaan, pahami implementasi tabel hash
- Lalu pelajari channel Saluran, pahami mekanisme komunikasi goroutine
- Selanjutnya pelajari select Multipleksing, kuasai teknik multipleksing
- Terakhir pelajari syncmap Pemetaan Konkuren, pahami implementasi keamanan konkuren
