Skip to content

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 "", bukan nil

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 read dan dirty untuk memisahkan baca dan tulis
  • Operasi Atom: read map menggunakan operasi atom, tanpa perlu kunci
  • Migrasi Progresif: Ketika hitungan miss mencapai ambang batas, dirty dipromosikan menjadi read

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.After untuk 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:

  1. Pelajari slice Slice dan string String terlebih dahulu, pahami struktur data dasar
  2. Kemudian pelajari map Tabel Pemetaan, pahami implementasi tabel hash
  3. Lalu pelajari channel Saluran, pahami mekanisme komunikasi goroutine
  4. Selanjutnya pelajari select Multipleksing, kuasai teknik multipleksing
  5. Terakhir pelajari syncmap Pemetaan Konkuren, pahami implementasi keamanan konkuren

Golang by www.golangdev.cn edit