Sobes.tech
Intern

Da li je sigurno čitati mape u Go?

sobes.tech АИ

Одговор од АИ

U jeziku Go, čitanje iz map nije sigurno za niti ako se istovremeno vrši zapis. Za sigurno čitanje u višestrukom okruženju, potrebno je koristiti sinhronizaciju, na primer, sync.RWMutex za zaključavanje pri čitanju i pisanju, ili koristiti sync.Map, koji je posebno dizajniran za konkurentan pristup.

Primer sa sync.RWMutex:

import (
    "sync"
)

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

func read(key string) (int, bool) {
    mu.RLock()         // zaključavanje za čitanje
    defer mu.RUnlock() // otključavanje
    val, ok := m[key]
    return val, ok
}

func write(key string, val int) {
    mu.Lock()         // zaključavanje za pisanje
    defer mu.Unlock() // otključavanje
    m[key] = val
}

Ili koristite sync.Map:

import "sync"

var m sync.Map

func read(key string) (interface{}, bool) {
    return m.Load(key)
}

func write(key string, val interface{}) {
    m.Store(key, val)
}

sync.Map je koristan kada postoji mnogo konkurentnih operacija, ali ima specifične osobine u pogledu performansi i API-ja.