Sobes.tech
Junior — Middle

Este posibil să se citească în siguranță date dintr-o structură de date map fără riscul de apariție a erorilor?

sobes.tech AI

Răspuns de la AI

În Go, citirea dintr-un map este sigură dacă în acel moment nimeni nu îl modifică. Cu toate acestea, dacă se face o scriere în paralel (adăugare, ștergere sau modificare de elemente), citirea poate duce la panică (eroare de rulare).

Pentru a citi în siguranță dintr-un map într-un mediu multi-thread, se folosesc de obicei:

  • sync.RWMutex — pentru a bloca map-ul pentru scriere și a permite citirea paralelă
  • sync.Map — o structură de date specializată și sigură pentru map-uri

Exemplu cu RWMutex:

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

func write(key string, val int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = val
}

Astfel, citirea sigură este posibilă dacă se asigură sincronizarea cu scrierea.