Sobes.tech
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.