Sobes.tech
Junior — Middle

Je možné bezpečne čítať údaje zo štruktúry dátovej mapy bez rizika vzniku chýb?

sobes.tech AI

Odpoveď od AI

V Go je čítanie z mapy bezpečné, ak v danom momente nikto mapu nemení. Avšak, ak paralelne dochádza k zápisu (pridanie, odstránenie alebo zmena prvkov), čítanie môže viesť k panike (runtime error).

Pre bezpečné čítanie z mapy v prostredí s viacerými vláknami sa zvyčajne používajú:

  • sync.RWMutex — na uzamknutie mapy pri zápise a umožnenie paralelného čítania
  • sync.Map — špecializovaná, vlákno-bezpečná dátová štruktúra pre mapy

Príklad s 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
}

Takto je možné bezpečne čítať, ak je zabezpečená synchronizácia s zápisom.