Sobes.tech
Intern

Ler mapas de forma segura em Go?

sobes.tech IA

Resposta da IA

No Go, a leitura de um map não é segura para múltiplas threads se também ocorrer uma escrita simultânea. Para ler de forma segura num ambiente multithread, deve-se usar sincronização, por exemplo, sync.RWMutex para bloquear na leitura e escrita, ou usar sync.Map, que foi especificamente desenvolvido para acesso concorrente.

Exemplo com sync.RWMutex:

import (
    "sync"
)

var (
    m  = make(map[string]int)
    mu sync.RWMutex
)

func read(key string) (int, bool) {
    mu.RLock()         // bloqueio na leitura
    defer mu.RUnlock() // desbloqueio
    val, ok := m[key]
    return val, ok
}

func write(key string, val int) {
    mu.Lock()         // bloqueio na escrita
    defer mu.Unlock() // desbloqueio
    m[key] = val
}

Ou 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 é útil quando há muitas operações concorrentes, mas possui particularidades em desempenho e API.