Intern
Ler mapas de forma segura em Go?
sobes.tech IA
Resposta da IA
No Go, a leitura de um map não é segura para múltiplas threads se também ocorrer uma escrita simultânea. Para ler de forma segura num ambiente multithread, deve-se usar sincronização, por exemplo, sync.RWMutex para bloquear na leitura e escrita, ou usar sync.Map, que foi especificamente desenvolvido para acesso concorrente.
Exemplo com sync.RWMutex:
import (
"sync"
)
var (
m = make(map[string]int)
mu sync.RWMutex
)
func read(key string) (int, bool) {
mu.RLock() // bloqueio na leitura
defer mu.RUnlock() // desbloqueio
val, ok := m[key]
return val, ok
}
func write(key string, val int) {
mu.Lock() // bloqueio na escrita
defer mu.Unlock() // desbloqueio
m[key] = val
}
Ou usar 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 é útil quando há muitas operações concorrentes, mas possui particularidades em desempenho e API.