Junior — Middle
Kuo skiriasi įprastos kortelės naudojimas su blokavimais ir sync.Map struktūra duomenų saugojimui?
sobes.tech AI
Atsakymas iš AI
Įprasta (map) Go nėra srauto saugi, todėl atliekant vienu metu keliuose gorutinuose, reikia naudoti užraktus (pvz., sync.Mutex arba sync.RWMutex) duomenų apsaugai. Tai reikalauja papildomo kodo ir gali sukelti užrakinimus bei našumo sumažėjimą esant dideliai konkurencijai.
sync.Map yra specializuota, srauto saugi duomenų struktūra, optimizuota dažniems skaitymams ir retoms įrašymams. Ji įgyvendina vidinius sinchronizacijos ir optimizavimo mechanizmus, leidžiančius išvengti aiškių užraktų kode.
Pagrindiniai skirtumai:
- Srauto saugumas:
sync.Mapiš pradžių yra srauto saugi, o įprasta žemėlapis — ne. - Našumas:
sync.Mapefektyvi daugeliui paralelinių skaitymų ir retų įrašų; įprastas žemėlapis su užraktais gali būti greitesnis žemoje konkurencijoje. - API:
sync.Mapturi ribotą metodų rinkinį (Load,Store,Delete,Range) ir nepalaiko tiesioginio indeksavimo.
sync.Map naudojimo pavyzdys:
var m sync.Map
m.Store("key", "value")
if val, ok := m.Load("key"); ok {
fmt.Println(val)
}
Jei jums reikia paprasto žemėlapio su prieigos kontrole, galite naudoti map su sync.RWMutex:
var (
mu sync.RWMutex
m = make(map[string]string)
)
// Rašymas
mu.Lock()
m["key"] = "value"
mu.Unlock()
// Skaitymas
mu.RLock()
val := m["key"]
mu.RUnlock()