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: ALen()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
mapmutex-szel vagysync.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. Affüggvény minden kulcs-érték párra meghívásra kerül. Haffalse-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.