Ralat "ralat maut: baca peta serentak dan tulis peta" dalam Go berlaku apabila berbilang goroutin cuba akses peta secara serentak untuk membaca dan menulis. Ini boleh berlaku apabila satu goroutine cuba membaca dari peta manakala goroutine lain secara serentak menulis kepadanya.
sync.RWMutex
Gunakan penyegerakan.RWMutex untuk mengawal akses kepada peta. Pilihan ini sesuai untuk senario dengan bacaan dan tulis tunggal (bukan gelung di atas peta).
var someMap = map[string]string{} var someMapMutex = sync.RWMutex{} go func() { someMapMutex.Lock() someMap["key"] = "value" someMapMutex.Unlock() }() someMapMutex.RLock() v, ok := someMap["key"] someMapMutex.RUnlock() if !ok { fmt.Println("key missing") return } fmt.Println(v)
peta penyegerakan.Peta
Alternatifnya ialah menggunakan peta segerak .Map{}, iaitu jenis peta serentak dalam Go. Ia mengendalikan keadaan perlumbaan secara dalaman dan biasanya lebih perlahan daripada peta biasa. Walau bagaimanapun, ia cemerlang dalam senario untuk gelung.
var someMap = syncmap.Map{} go func() { someMap.Store("key", "value") }() v, ok := someMap.Load("key") if !ok { fmt.Println("key missing") return } fmt.Println(v) // Looping over keys is simplified with syncmap someMap.Range(func(key, value interface{}) bool { val, ok := value.(string) if !ok { return false // Break iteration } fmt.Println(key, val) return true // Continue iteration })
Untuk mengelakkan ralat ini, disyorkan untuk menguji pelayan anda dengan pilihan -race untuk mengenal pasti dan menghapuskan kemungkinan keadaan perlumbaan .
go run -race server.go
Dengan melaksanakan penyelesaian ini dan mengikut garis panduan ini, anda boleh mengelakkan "pembacaan peta serentak dan ralat tulis peta" dan pastikan akses selamat benang kepada data kongsi dalam kod Go anda.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan 'ralat maut: baca peta serentak dan tulis peta' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!