Sobes.tech
Middle

¿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.