Middle
Čo vieš o balíčku sync.Map?
sobes.tech AI
Odpoveď od AI
Balík sync.Map poskytuje bezpečnú hash tabuľku pre paralelné operácie. Je optimalizovaný pre prípady, keď sa kľúče čítajú prevažne a zapisujú menej často.
Kľúčové vlastnosti:
- Paralelná bezpečnosť: Zaručuje bezpečný prístup z viacerých gorút bez explicitného blokovania.
- Optimalizované pre čítanie: Pri prvom čítaní každého kľúča sa cache-uje kópia iba na čítanie. Následné čítania z tejto cache nevyžadujú blokovanie.
- Dynamické odstraňovanie: Odstránené prvky sú najskôr označené ako odstránené a skutočné odstránenie nastáva za určitých podmienok, aby sa minimalizovalo blokovanie pri zápise.
- Chýba metóda
Len(): Podpora metódyLen()by spravila paralelne bezpečnú implementáciu zložitou a nákladnou. - Nevhodné pre neustále sa meniace dáta: Pri častých zápisoch a odstráneniach môže byť menej efektívne ako použitie mutexu s bežnou
map.
Hlavné metódy:
Load(key any) (value any, ok bool): Načíta hodnotu spojenú s kľúčom. Ak kľúč chýba, vrátifalse.Store(key, value any): Uloží hodnotu pre kľúč. Môže sa použiť na pridanie alebo aktualizáciu.LoadOrStore(key any, value any) (actual any, loaded bool): Načíta hodnotu spojenú s kľúčom, ak už existuje. Inak uloží zadanú hodnotu. Vráti skutočnú hodnotu a príznak, či bola hodnota načítaná (true) alebo uložená (false).Delete(key any): Odstráni hodnotu pre kľúč.Range(f func(key, value any) bool): Prechádza prvky v mape v ľubovoľnom poradí. Funkciafsa volá pre každý pár kľúč-hodnota. Akfvrátifalse, iterácia sa ukončí.
Príklad použitia:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// Používame v
}
m.Range(func(key, value any) bool {
// Spracovávame prvky
return true // Pokračovať v iterácii
})
}
Celkovo je sync.Map dobrou voľbou, keď paralelné čítania výrazne prevládajú nad zápismi a odstráneniami. Inak môže byť vhodnejšie použiť map v spojení s sync.Mutex alebo sync.RWMutex.