Sobes.tech
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ódy Len() 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áti false.
  • 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í. Funkcia f sa volá pre každý pár kľúč-hodnota. Ak f vráti false, 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.