Intern
Безопасно ли е да четете карти в Go?
sobes.tech AI
Отговор от AI
В Go четенето от map не е потокобезопасно, ако едновременно се извършва запис. За безопасно четене в многопоточна среда трябва да се използва синхронизация, например sync.RWMutex за заключване при четене и писане, или sync.Map, който е специално разработен за конкурентен достъп.
Пример с sync.RWMutex:
import (
"sync"
)
var (
m = make(map[string]int)
mu sync.RWMutex
)
func read(key string) (int, bool) {
mu.RLock() // заключване за четене
defer mu.RUnlock() // отключване
val, ok := m[key]
return val, ok
}
func write(key string, val int) {
mu.Lock() // заключване за писане
defer mu.Unlock() // отключване
m[key] = val
}
Или използвайте sync.Map:
import "sync"
var m sync.Map
func read(key string) (interface{}, bool) {
return m.Load(key)
}
func write(key string, val interface{}) {
m.Store(key, val)
}
sync.Map е удобен, когато има много конкурентни операции, но има особености по отношение на производителността и API-то.