Middle
Co víš o balíčku sync.Map?
sobes.tech AI
Odpověď od AI
Balíček sync.Map poskytuje bezpečnou hash tabulku pro paralelní přístup. Je optimalizován pro případy, kdy jsou klíče převážně čteny a méně často zapisovány.
Hlavní vlastnosti:
- Paralelní bezpečnost: Zajišťuje bezpečný přístup z více gorutin bez explicitního blokování.
- Optimalizováno pro čtení: Při prvním čtení každého klíče je do cache uložena kopie pouze pro čtení. Další čtení z této cache nevyžadují blokování.
- Dynamické mazání: Odstraněné prvky jsou nejprve označeny jako odstraněné a skutečné odstranění probíhá za určitých podmínek, aby se minimalizovalo blokování při zápisu.
- Chybí metoda
Len(): Podpora metodyLen()by činila paralelně bezpečnou implementaci složitou a nákladnou. - Není vhodné pro neustále se měnící data: Při častých zápisech a mazání může být méně efektivní než použití mutexu s běžnou
mapou.
Hlavní metody:
Load(key any) (value any, ok bool): Načte hodnotu spojenou s klíčem. Pokud klíč neexistuje, vracífalse.Store(key, value any): Uloží hodnotu pro klíč. Může být použito pro přidání nebo aktualizaci.LoadOrStore(key any, value any) (actual any, loaded bool): Načte hodnotu spojenou s klíčem, pokud již existuje. Jinak uloží zadanou hodnotu. Vrací skutečnou hodnotu a příznak, zda byla hodnota načtena (true) nebo uložena (false).Delete(key any): Odstraní hodnotu pro klíč.Range(f func(key, value any) bool): Iteruje přes prvky v mapě v libovolném pořadí. Funkcefje volána pro každý pár klíč-hodnota. Pokudfvrátífalse, iterace se ukončí.
Příklad použití:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// Použijte v
}
m.Range(func(key, value any) bool {
// Zpracování prvků
return true // Pokračovat v iteraci
})
}
Obecně je sync.Map dobrou volbou, když paralelní čtení výrazně převyšují zápisy a mazání. Jinak může být vhodnější použití map s sync.Mutex nebo sync.RWMutex.