Sobes.tech
Middle

Mit tudsz a sync.Map csomagról?

sobes.tech MI

Válasz az MI-től

A sync.Map csomag egy párhuzamosan biztonságos hash-táblát biztosít. Olyan esetekre optimalizált, amikor a kulcsokat főként olvassák, és ritkábban írják.

Fő jellemzők:

  • Párhuzamos biztonság: Biztosítja a több goroutine-ból történő biztonságos hozzáférést explicits zárolások nélkül.
  • Olvasásra optimalizált: Minden kulcs első olvasásakor egy csak olvasásra szánt másolat kerül cache-be. A későbbi olvasások ebből a cache-ből nem igényelnek zárolást.
  • Dinamikus törlés: A törölt elemeket először töröltként jelölik, és a valódi törlés bizonyos feltételek mellett történik, hogy minimalizálja a zárolásokat írás közben.
  • Len() metódus hiánya: A Len() metódus támogatása bonyolulttá és drágává tenné a párhuzamosan biztonságos megvalósítást.
  • Nem alkalmas folyamatosan változó adatokra: Gyakori írások és törlések esetén kevésbé lehet hatékony, mint egy map mutex-szel vagy sync.RWMutex-szal.

Fő metódusok:

  • Load(key any) (value any, ok bool): Betölti a kulccsal összekapcsolt értéket. Ha a kulcs nem létezik, false-t ad vissza.
  • Store(key, value any): Elment egy értéket a kulcshoz. Használható hozzáadáshoz vagy frissítéshez.
  • LoadOrStore(key any, value any) (actual any, loaded bool): Betölti a kulccsal összekapcsolt értéket, ha már létezik. Ellenkező esetben elmenti a megadott értéket. Visszaadja a tényleges értéket és egy zászlót, ami jelzi, hogy az érték betöltődött (true) vagy el lett mentve (false).
  • Delete(key any): Törli az értéket a kulcshoz.
  • Range(f func(key, value any) bool): Véletlenszerű sorrendben iterál a térképen. A f függvény minden kulcs-érték párra meghívásra kerül. Ha f false-t ad vissza, az iteráció megáll.

Használati példa:

import "sync"

var m sync.Map

func process(key string, value int) {
	m.Store(key, value)

	v, ok := m.Load(key)
	if ok {
		// Használja a v-t
	}

	m.Range(func(key, value any) bool {
		// Elemenek feldolgozása
		return true // Az iteráció folytatása
	})
}

Általánosságban a sync.Map jó választás, ha a párhuzamos olvasások jelentősen meghaladják az írásokat és törléseket. Ellenkező esetben a map sync.Mutex vagy sync.RWMutex-szal való használata lehet megfelelőbb.