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.