Middle
Kādus mutexus izmantojat, lai nodrošinātu drošību, strādājot ar kartēm Go?
sobes.tech AI
Atbilde no AI
Lai nodrošinātu drošību, strādājot ar nekonkurējošu piekļuvi datu struktūrām, tostarp kartēm (map), Go izmanto sync pakotnes mutexus.
sync.Mutex: Pamata mutex, kas nodrošina izslēgšanu. To izmanto, bloķējot un atbloķējot kodu, kur notiek lasīšana vai rakstīšana kartē.sync.RWMutex: Mutex ar dalītu (lasīšanas) un ekskluzīvu (rakstīšanas) piekļuvi. Atļauj vairākiem gorutīnām lasīt no kartes vienlaicīgi, bet tikai vienai rakstīt. Ideāli scenārijiem, kuros lasījumi ir daudz biežāki nekā raksti.
Virsroku priekšroka ir sync.RWMutex, jo tas nodrošina labāku veiktspēju daudzlīmeņu lasīšanas operācijās.
sync.RWMutex lietošanas piemērs:
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() // Bloķēšana rakstīšanai
defer sm.mu.Unlock()
sm.m[key] = value
}
func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock() // Bloķēšana lasīšanai
defer sm.mu.RUnlock()
value, ok := sm.m[key]
return value, ok
}
Ir arī specializēts tips sync.Map, kas ir optimizēts konkurējošai lietošanai bez skaidras mutex bloķēšanas lielākajā daļā gadījumu, bet tam ir noteikti ierobežojumi un cits API. Tomēr, ja nepieciešama lielāka kontrole pār bloķēšanu vai specifiski piekļuves scenāriji, sync.RWMutex izmantošana virs standarta map ir izplatīta prakse.