Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyelesaikan 'ralat maut: baca peta serentak dan tulis peta' dalam Go?

Bagaimana untuk Menyelesaikan 'ralat maut: baca peta serentak dan tulis peta' dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-31 04:09:40443semak imbas

How to Solve the

"Ralat maut Golang: baca peta serentak dan tulis peta" Diterangkan

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.

Penyelesaian

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
})

Nasihat Umum

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn