Intern
¿Es seguro leer mapas concurrentemente en Go?
sobes.tech AI
Respuesta de la IA
En Go, la lectura de un map no es segura para múltiples hilos si también se realiza una escritura simultáneamente. Para leer de manera segura en un entorno multihilo, se debe usar sincronización, por ejemplo, sync.RWMutex para bloquear en lectura y escritura, o usar sync.Map, que está diseñado específicamente para acceso concurrente.
Ejemplo con sync.RWMutex:
import (
"sync"
)
var (
m = make(map[string]int)
mu sync.RWMutex
)
func read(key string) (int, bool) {
mu.RLock() // bloqueo en lectura
defer mu.RUnlock() // desbloqueo
val, ok := m[key]
return val, ok
}
func write(key string, val int) {
mu.Lock() // bloqueo en escritura
defer mu.Unlock() // desbloqueo
m[key] = val
}
O 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 es conveniente cuando hay muchas operaciones concurrentes, pero tiene particularidades en rendimiento y API.