Sobes.tech
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.Map iš pradžių yra srauto saugi, o įprasta žemėlapis — ne.
  • Našumas: sync.Map efektyvi daugeliui paralelinių skaitymų ir retų įrašų; įprastas žemėlapis su užraktais gali būti greitesnis žemoje konkurencijoje.
  • API: sync.Map turi 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()