Middle
Aké mutexy používate na zabezpečenie bezpečnosti pri práci s mapami v Go?
sobes.tech AI
Odpoveď od AI
Pre zabezpečenia bezpečnosti pri práci s nekonkurentným prístupom k dátovým štruktúram, vrátane máp (map), v Go sa používajú mutexy z balíka sync.
sync.Mutex: Základný mutex pre vzájomné vylúčenie. Používa sa na blokovanie a odblokovanie častí kódu, kde dochádza ku čítaniu alebo zápisu do mapy.sync.RWMutex: Mutex s deleným (čítanie) a výlučným (zápis) prístupom. Umožňuje viacerým gorutinám čítať z mapy súčasne, ale len jednej zapisovať. Ideálny pre scenáre, kde sú čítania výrazne častejšie ako zápisy.
Preferovanou voľbou pre súčasnú a bezpečnú prácu s mapami je sync.RWMutex, pretože zabezpečuje lepší výkon pri viacerých súčasných operáciách čítania.
Príklad použitia 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() // Zámok pre zápis
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Zámok pre čítanie
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Existuje aj špecializovaný typ sync.Map, ktorý je optimalizovaný pre použitie v konkurenčných prostrediach bez explicitného zamykania mutexmi vo väčšine prípadov, ale má určité obmedzenia a iné API. Ak je však potrebná flexibilnejšia kontrola nad zámkami alebo špecifické scenáre prístupu, používanie sync.RWMutex na štandardnej map je bežnou praxou.