Чӣ гуна бояд аз хатоҳо ҳангоми навиштани ҳамзамон дар харита муҳофизат кард?
sobes.tech AI
Ҷавоб аз AI
Барои муҳофизат аз хатоҳо дар навиштани ҳамзамон дар map дар Golang, ки ба таври пешфарз бехатар барои тиреза нестанд, механизмҳои зерин истифода мешаванд:
-
sync.Mutex: бастани харита пеш аз навиштан ва озод кардани он пас аз навиштан.import "sync" type SafeMap struct { mu sync.Mutex data map[string]int } func NewSafeMap() *SafeMap { return &SafeMap{ data: make(map[string]int), } } func (sm *SafeMap) Set(key string, value int) { sm.mu.Lock() defer sm.mu.Unlock() sm.data[key] = value } func (sm *SafeMap) Get(key string) (int, bool) { sm.mu.Lock() defer sm.mu.Unlock() val, ok := sm.data[key] return val, ok } -
sync.RWMutex: Имкон медиҳад, ки чанд тиреза ҳамзамон аз харита хонда шаванд, аммо навиштани ҳамзамонро дар вақти хондан ё навишт манъ мекунад.import "sync" type SafeMapRWMutex struct { mu sync.RWMutex data map[string]int } func NewSafeMapRWMutex() *SafeMapRWMutex { return &SafeMapRWMutex{ data: make(map[string]int), } } func (sm *SafeMapRWMutex) Set(key string, value int) { sm.mu.Lock() // Блоки навишт defer sm.mu.Unlock() sm.data[key] = value } func (sm *SafeMapRWMutex) Get(key string) (int, bool) { sm.mu.RLock() // Блоки хондан defer sm.mu.RUnlock() val, ok := sm.data[key] return val, ok } -
sync.Map: Намуди махсус, бехатар барои тиреза, оптимизатсияшуда барои сценарҳо, ки дар он маҷмӯи калидҳо нисбатан устувор аст, навиштҳо каманд, ё вақте чанд тиреза хонда ва навишта барои маҷмӯаҳои калидҳои дисюнктивӣ.import "sync" var safeMap sync.Map // Ифода func UseSyncMap() { safeMap.Store("key1", 10) // Навишт if val, ok := safeMap.Load("key1"); ok { // Хондан // Истифодаи val } safeMap.Delete("key1") // Баъд аз тоза кардан }
Мувофиқати роҳҳо:
| Механизм | Манфиатҳо | Норасоиҳо | Барнома |
|---|---|---|---|
sync.Mutex |
Осон дар истифода | Блок мекунад ҳама амалиёт дар вақти навиштани он | Сценарҳои оддӣ, ки дар он рақобат баланд нест ё хондан/навишт тақрибан баробар аст. |
sync.RWMutex |
Имкон медиҳад, ки хондани ҳамзамон дар бисёре аз тирезаҳо | Муҳитро мураккабтар аз sync.Mutex. Навишт блок мекунад хондан ва дигар навиштҳоро. |
Сценарҳо бо хондани зуд ва навиштани кам. |
sync.Map |
Беҳтарин барои сценарҳо муайяншуда | API маҳдуд дорад. Мумкин аст нисбат ба Mutex сусттар бошад, агар дастрасӣ комилан тасодуфӣ бошад. |
Сценарҳо бо калидҳои нисбатан устувор ё маҷмӯаҳои дисюнктивӣ барои дастрасӣ ба тирезаҳои гуногун. |
Интихоби механизми муайян вобаста ба хоси дастрасии ҳамзамон ба харита. Барои ҳолатҳои умумӣ, одатан sync.Mutex ё sync.RWMutex кофист. Барои сценарҳои махсус, sync.Map метавонад беҳтар кор кунад.