Sobes.tech
Junior — Middle

Quais são as diferenças entre usar um cartão normal com bloqueios e a estrutura sync.Map para armazenar dados?

sobes.tech IA

Resposta da IA

Uma mapa (map) normal em Go não é segura para uso concorrente, portanto, ao acessá-la simultaneamente de várias goroutines, é necessário usar bloqueios (por exemplo, sync.Mutex ou sync.RWMutex) para proteger os dados. Isso requer código adicional e pode levar a bloqueios e redução de desempenho em situações de alta concorrência.

sync.Map é uma estrutura de dados especializada e segura para concorrência, otimizada para cenários com operações frequentes de leitura e poucas gravações. Ela implementa mecanismos internos de sincronização e otimização, permitindo evitar bloqueios explícitos no código.

Principais diferenças:

  • Segurança em concorrência: sync.Map é intrinsecamente segura para múltiplas threads, enquanto um mapa normal não é.
  • Desempenho: sync.Map é eficiente com muitas leituras paralelas e poucas gravações; um mapa normal com bloqueios pode ser mais rápido em baixa concorrência.
  • API: sync.Map possui um conjunto limitado de métodos (Load, Store, Delete, Range), e não suporta acesso direto por indexação.

Exemplo de uso de sync.Map:

var m sync.Map
m.Store("key", "value")
if val, ok := m.Load("key"); ok {
    fmt.Println(val)
}

Se precisar de um mapa simples com controle de acesso, pode usar um map com sync.RWMutex:

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

// Escrita
mu.Lock()
m["key"] = "value"
mu.Unlock()

// Leitura
mu.RLock()
val := m["key"]
mu.RUnlock()