Sobes.tech
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 metody Len() 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í. Funkce f je volána pro každý pár klíč-hodnota. Pokud f vrá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.