Middle
Quali mutex utilizzi per garantire la sicurezza durante l'uso delle mappe in Go?
sobes.tech AI
Risposta dell'AI
Per garantire la sicurezza durante il lavoro con strutture dati, inclusi le mappe (map), in Go si utilizzano mutex dal pacchetto sync.
sync.Mutex: Mutex di base per l’esclusione mutua. Viene usato per bloccare e sbloccare sezioni di codice in cui si effettua la lettura o la scrittura sulla mappa.sync.RWMutex: Mutex con accesso condiviso (lettura) ed esclusivo (scrittura). Permette a più goroutine di leggere contemporaneamente dalla mappa, ma solo a una di scrivere. È ideale per scenari in cui le letture sono molto più frequenti delle scritture.
La soluzione preferita per lavorare in modo concorrente e sicuro con le mappe è sync.RWMutex, poiché garantisce migliori prestazioni durante operazioni di lettura simultanee.
Esempio di utilizzo di sync.RWMutex:
import (
"sync"
)
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func NewSafeMap() *SafeMap {
return &SafeMap{
m: make(map[string]int),
}
}
func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock() // Blocco per scrittura
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Blocco per lettura
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Esiste anche un tipo specializzato sync.Map, ottimizzato per l’uso concorrente senza blocchi espliciti tramite mutex nella maggior parte dei casi, ma con alcune limitazioni e API diverse. Tuttavia, se si necessita di un controllo più flessibile sui blocchi o scenari di accesso specifici, l’uso di sync.RWMutex su una mappa standard è una pratica comune.