Sobes.tech
Intern

Lire une carte de manière thread-safe en Go?

sobes.tech IA

Réponse de l'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.