Sobes.tech
Junior — Middle

Pode explicar as principais diferenças entre a estrutura de dados padrão Map e a implementação segura para threads sync.Map em Go?

sobes.tech IA

Resposta da IA

O Map em Go é um tipo de dado embutido para armazenar pares chave-valor, mas não é seguro para concorrência. O acesso simultâneo de várias goroutines pode causar condições de corrida e panics.

sync.Map é uma implementação segura para concorrência do mapa do pacote sync, projetada para ambientes concorrentes.

Principais diferenças:

  • Segurança para concorrência: sync.Map é seguro para leitura e escrita simultâneas de diferentes goroutines sem sincronização adicional.

  • API: sync.Map possui métodos Store, Load, LoadOrStore, Delete e Range, e difere da sintaxe habitual do mapa.

  • Desempenho: sync.Map é otimizado para cenários com muitas leituras e poucas escritas. Para escritas frequentes, um mapa normal com mutex pode ser mais rápido.

  • Inicialização: um mapa normal precisa ser inicializado (make(map[key]value)), enquanto sync.Map é uma estrutura pronta para uso.

Exemplo de uso de sync.Map:

var m sync.Map

m.Store("key", "value")
value, ok := m.Load("key")
if ok {
    fmt.Println(value)
}

m.Delete("key")

Portanto, sync.Map é conveniente para acesso concorrente sem gerenciar bloqueios manualmente.