Sobes.tech
Junior — Middle

Czy można bezpiecznie odczytywać dane z struktury danych map bez ryzyka wystąpienia błędów?

sobes.tech AI

Odpowiedź od AI

W Go odczyt z mapy jest bezpieczny, jeśli w tym momencie nikt jej nie modyfikuje. Jednak jeśli równocześnie dochodzi do zapisu (dodawanie, usuwanie lub modyfikacja elementów), odczyt może spowodować panikę (błąd wykonania).

Aby bezpiecznie odczytywać z mapy w środowisku wielowątkowym, zazwyczaj używa się:

  • sync.RWMutex — do blokowania mapy podczas zapisu i umożliwiania równoczesnego odczytu
  • sync.Map — specjalizowanej, bezpiecznej struktury danych dla map

Przykład z 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
}

W ten sposób bezpieczne odczyty są możliwe, jeśli zapewni się synchronizację z zapisem.