sync.Once dan sync.Map
Pemulaan sekali sahaja dan map serentak
sync.Once dan sync.Map ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.
sync.Once
sync.Once menjamin bahawa sesuatu fungsi dijalankan tepat sekali, tanpa mengira bilangan goroutine yang memanggilnya secara serentak. Kes penggunaan klasik: inisialisasi tertunda bagi objek tunggal.
Once.Do
Hanya panggilan pertama kepada Do melaksanakan fungsi tersebut; panggilan seterusnya tidak melakukan apa-apa walaupun dipanggil daripada goroutine yang berbeza.
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Once tidak ditetapkan semula
Selepas sync.Once dijalankan, ia tidak boleh ditetapkan semula. Jika anda memerlukan pelaksanaan sekali sahaja yang boleh ditetapkan semula, uruskan keadaan secara manual menggunakan operasi atomik atau mutex.
Tingkah laku panik Once
Jika fungsi yang dihantar kepada Do mengalami panik, Do dianggap selesai dan panggilan seterusnya tidak melakukan apa-apa. Panik itu disebarkan kepada pemanggil pertama.
Gambaran keseluruhan sync.Map
sync.Map ialah peta serentak tanpa penguncian luaran. Ia dioptimumkan untuk dua corak: (1) tulis sekali, baca banyak kali; (2) set kunci berasingan bagi setiap goroutine.
Kaedah sync.Map
Kaedah utama: Store, Load, LoadOrStore, Delete, Range. Tiada parameter jenis generik — kunci dan nilai ialah interface{}.
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStore mengembalikan nilai sedia ada jika kunci wujud; jika tidak, ia menyimpan dan mengembalikan nilai baharu. Nilai boolean menunjukkan sama ada nilai itu dimuatkan (true) atau disimpan (false).
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Range mengulangi semua pasangan kunci-nilai dengan memanggil fungsi bagi setiap pasangan. Kembalikan false untuk menghentikan lelaran.
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})Bila hendak menggunakan sync.Map
Utamakan peta biasa dengan Mutex bagi kebanyakan kes — ia lebih ringkas dan selalunya lebih pantas. Gunakan sync.Map apabila pemprofilan menunjukkan persaingan atau corak akses sepadan dengan sasaran pengoptimumannya.
LoadAndDelete
LoadAndDelete memuatkan nilai dan memadam kunci secara atomik, lalu mengembalikan nilai sebelumnya serta maklumat sama ada kunci itu wujud.
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Map bukan generik
Nilai yang disimpan dalam sync.Map ialah any. Balut sync.Map dalam struktur bertip dengan kaedah yang selamat dari segi jenis untuk mengelakkan penegasan jenis yang bertaburan dalam pangkalan kod anda.
Semakan Pantas
Apakah yang dijamin oleh sync.Once?
Ringkasan: sync.Once dan sync.Map
Perkara utama:
- sync.Once: jalankan sesuatu fungsi tepat sekali; tidak boleh diterbalikkan
- sync.Map: peta serentak yang dioptimumkan untuk corak yang banyak membaca atau menggunakan kunci berasingan
- Gunakan pembalut bertip di sekeliling sync.Map untuk keselamatan
Pelajari Go dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “sync.Once dan sync.Map” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “sync.Once dan sync.Map”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “sync.Once dan sync.Map”?
Pemulaan sekali sahaja dan map serentak Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Go Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “sync.Once dan sync.Map” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- sync.Mutex dan sync.RWMutex
- sync.WaitGroup
- sync.Once dan sync.Map
- Pengesan Perlumbaan dan Corak Selamat