Sobes.tech
Junior — Middle

Омӯзиши бехатарӣ дар ҳоле ки маълумотҳоро дар Map дар муҳити бисёрсоҳавӣ мутамарказ кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Дар Go стандартная карта (map) барои дастрасии ҳамзамон бехатар нест. Агар чанд goroutine аз map хонанд бе навиштан, ин бехатар аст. Аммо, агар ҳадди ақал як goroutine ба map нависад, хондан ва навиштани ҳамзамон паника меорад.

Барои хондани бехатар аз map бе навиштан, шумо метавонед map оддӣ бе синхронгардонӣ истифода баред. Аммо агар имкони навиштани вуҷуд дошта бошад, бояд синхронгардонии истифода баред, масалан, тавассути sync.RWMutex ё sync.Map, ки махсус барои дастрасии ҳамзамон тарҳрезӣ шудааст.

Масал бо sync.RWMutex барои хондан ва навишти бехатар:

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

// Навишт
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// Хондан
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

Агар шумо кафолат диҳед, ки map пас аз оғоз кардан дигар тағйир намеёбад, пас хондани ҳамзамон бехатар аст бе синхронгардонии иловагӣ.