Sobes.tech
Junior — Middle

Може ли безопасно да се чете данни от структура от данни map без риск от грешки?

sobes.tech AI

Отговор от AI

В Go четенето от map е безопасно, ако в този момент никой не я променя. Въпреки това, ако паралелно се извършва запис (добавяне, изтриване или промяна на елементи), четенето може да доведе до паника (грешка по време на изпълнение).

За безопасно четене от map в многопоточна среда обикновено се използват:

  • sync.RWMutex — за заключване на map за писане и разрешаване на паралелно четене
  • sync.Map — специализирана, потокобезопасна структура за данни за map

Пример с 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
}

Така, безопасното четене е възможно, ако се осигури синхронизация с писането.