Konsep akses serentak kepada peta menggunakan kata kunci julat dalam Go sering disalahertikan. Untuk menjelaskan perkara ini, mari kita terokai selok-belok mengakses peta secara serentak dan implikasi penggunaan julat.
Ungkapan julat dalam pernyataan for hanya dinilai sekali sebelum gelung bermula, tidak termasuk senario tertentu tertentu. Dalam kes peta, ungkapan julat hanya menunjuk kepada pembolehubah peta.
Semasa lelaran dengan julat, pembolehubah kunci dan nilai (k dan v dalam kebanyakan kes) pegang nilai dari peta semasa setiap lelaran. Walau bagaimanapun, capaian peta tidak berlaku dalam blok for semasa melaksanakan lelaran. Ia berlaku apabila nilai k dan v ditetapkan untuk lelaran seterusnya.
Memahami konsep ini, adalah selamat untuk melakukan lelaran serentak di atas peta dengan menggunakan kunci untuk melindungi peta semasa lelaran. Walau bagaimanapun, membuka kunci dalam lelaran harus dilakukan sebagai pernyataan tertunda untuk mengendalikan pulangan awal.
var testMap = make(map[int]int) var testMapLock = &sync.RWMutex{} func IterateMapKeys(iteratorChannel chan int) error { testMapLock.RLock() defer testMapLock.RUnlock() for k, v := range testMap { testMapLock.RUnlock() someFunc() testMapLock.RLock() if someCond { return someErr } } return nil }
Adalah penting untuk ambil perhatian bahawa skim penguncian jenis ini hanya selamat daripada akses serentak . Ia tidak menghalang pengubahsuaian serentak oleh goroutine lain. Walau bagaimanapun, jika pengubahsuaian dikawal dengan kunci tulis, ia kekal selamat, tetapi gelung for tidak semestinya akan berulang pada pasangan baharu.
Membuka kunci baca dalam blok untuk adalah tidak selamat, kerana ia membenarkan gorouti lain mengubah suai peta dan berpotensi menyebabkan keadaan perlumbaan.
Atas ialah kandungan terperinci Adakah Peta Lelaran Over Go serentak dengan `julat` Selamat, dan Bagaimana Ia Boleh Dicapai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!