sync.Once dan sync.Map
Inisialisasi satu kali dan map konkuren
sync.Once dan sync.Map adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
sync.Once
sync.Once menjamin bahwa suatu fungsi dijalankan tepat satu kali, berapa pun jumlah goroutine yang memanggilnya secara bersamaan. Kasus penggunaan klasiknya adalah inisialisasi singleton sesuai kebutuhan.
Once.Do
Hanya pemanggilan pertama ke Do yang menjalankan fungsi; pemanggilan berikutnya tidak melakukan apa pun, meskipun dipanggil dari goroutine yang berbeda.
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Once tidak dapat diatur ulang
Setelah sync.Once dijalankan, objek tersebut tidak dapat diatur ulang. Jika Anda memerlukan eksekusi satu kali yang dapat diatur ulang, kelola status secara manual dengan operasi atomik atau mutex.
Perilaku Once saat terjadi kepanikan
Jika fungsi yang diteruskan ke Do mengalami panic, Do dianggap selesai dan pemanggilan berikutnya tidak melakukan apa pun. Panic diteruskan ke pemanggil pertama.
Gambaran umum sync.Map
sync.Map adalah map konkuren tanpa penguncian eksternal. Map ini dioptimalkan untuk dua pola: (1) ditulis sekali, dibaca berkali-kali; (2) setiap goroutine menggunakan kumpulan kunci yang tidak saling tumpang tindih.
Metode sync.Map
Metode utama: Store, Load, LoadOrStore, Delete, Range. Tidak ada parameter tipe generik—kunci dan nilainya adalah interface{}.
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStore mengembalikan nilai yang sudah ada jika kunci tersebut ada; jika tidak, metode ini menyimpan dan mengembalikan nilai baru. Nilai boolean menunjukkan apakah nilai dimuat (true) atau disimpan (false).
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Range mengiterasi semua pasangan kunci-nilai dengan memanggil fungsi untuk setiap pasangan. Kembalikan false untuk menghentikan iterasi.
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})Kapan menggunakan sync.Map
Untuk sebagian besar kasus, pilih map biasa dengan Mutex—solusinya lebih sederhana dan sering kali lebih cepat. Gunakan sync.Map jika pembuatan profil menunjukkan adanya perebutan akses atau pola aksesnya sesuai dengan sasaran optimisasinya.
LoadAndDelete
LoadAndDelete memuat nilai dan menghapus kunci secara atomik, lalu mengembalikan nilai sebelumnya serta informasi apakah kunci tersebut ada.
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Map bukan tipe generik
Nilai yang disimpan dalam sync.Map bertipe any. Bungkus sync.Map dalam struct bertipe dengan metode yang aman terhadap tipe untuk menghindari pemeriksaan tipe yang tersebar di seluruh basis kode Anda.
Pemeriksaan singkat
Apa yang dijamin oleh sync.Once?
Ringkasan: sync.Once dan sync.Map
Poin penting:
- sync.Once: menjalankan suatu fungsi tepat satu kali; tidak dapat dibatalkan
- sync.Map: map konkuren yang dioptimalkan untuk pola yang didominasi pembacaan atau menggunakan kunci yang tidak saling tumpang tindih
- Gunakan pembungkus bertipe di sekitar sync.Map demi keamanan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “sync.Once dan sync.Map” gratis?
Ya — teks lengkap “sync.Once dan sync.Map” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “sync.Once dan sync.Map”?
Inisialisasi satu kali dan map konkuren Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “sync.Once dan sync.Map” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- sync.Mutex dan sync.RWMutex
- sync.WaitGroup
- sync.Once dan sync.Map
- Detektor Race dan Pola Aman