Middle
Jaké mutexy používáte k zajištění bezpečnosti při práci s mapami v Go?
sobes.tech AI
Odpověď od AI
Pro zajištění bezpečnosti při práci s nekonkurentním přístupem k datovým strukturám, včetně map (map), v Go se používají mutexy z balíčku sync.
sync.Mutex: Základní mutex pro vzájemné vyloučení. Používá se k blokování a odblokování částí kódu, kde dochází ke čtení nebo zápisu do mapy.sync.RWMutex: Mutex s sdíleným (čtení) a výlučným (zápis) přístupem. Umožňuje více gorutinám číst z mapy současně, ale pouze jedné zapisovat. Je ideální pro scénáře, kde jsou čtení výrazně častější než zápisy.
Preferovanou volbou pro současnou a bezpečnou práci s mapami je sync.RWMutex, protože zajišťuje lepší výkon při více současných operacích čtení.
Příklad použití sync.RWMutex:
import (
"sync"
)
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func NewSafeMap() *SafeMap {
return &SafeMap{
m: make(map[string]int),
}
}
func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock() // Zamknutí pro zápis
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Zamknutí pro čtení
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Existuje také specializovaný typ sync.Map, který je optimalizován pro použití v konkurenčních prostředích bez explicitního zamykání mutexy ve většině případů, ale má určitá omezení a jinou API. Pokud je však potřeba flexibilnější kontrola nad zámky nebo specifické scénáře přístupu, je běžnou praxí použití sync.RWMutex nad standardní mapou.