¿Qué mutexes utilizas para garantizar la seguridad al trabajar con mapas en Go?
sobes.tech AI
Respuesta de la IA
Para garantizar la seguridad al trabajar con acceso no competitivo a estructuras de datos, incluyendo mapas (map), en Go se utilizan mutexes del paquete sync.
sync.Mutex: Mutex básico para exclusión mutua. Se usa para bloquear y desbloquear secciones de código donde se realiza lectura o escritura en un mapa.sync.RWMutex: Mutex con acceso compartido (lectura) y exclusivo (escritura). Permite que varias goroutines lean del mapa simultáneamente, pero solo una escriba. Es ideal para escenarios donde las lecturas superan ampliamente a las escrituras.
La opción preferida para trabajar con mapas de forma concurrente y segura es sync.RWMutex, ya que proporciona mejor rendimiento en operaciones de lectura simultáneas.
Ejemplo de uso de sync.RWMutex:
import (
"sync"
)
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func NewSafeMap() *SafeMap {
return &SafeMap{
m: make(map[string]int),
}
}
func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock() // Bloqueo para escritura
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Bloqueo para lectura
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
También existe un tipo especializado sync.Map, que está optimizado para uso concurrente sin bloqueo explícito mediante mutex en la mayoría de los casos, aunque tiene ciertas limitaciones y una API diferente. Sin embargo, si se requiere un control más flexible sobre los bloqueos o escenarios de acceso específicos, usar sync.RWMutex sobre un map estándar es una práctica común.