Sobes.tech
Intern

Je čítanie máp v Go bezpečné?

sobes.tech AI

Odpoveď od AI

V jazyku Go nie je čítanie z map bezpečné pre vlákna, ak sa súčasne vykonáva zápis. Pre bezpečné čítanie v prostredí s viacerými vláknami je potrebné použiť synchronizáciu, napríklad sync.RWMutex na uzamknutie pri čítaní a zápise, alebo použiť sync.Map, ktorý je špeciálne navrhnutý pre konkurenčný prístup.

Príklad s sync.RWMutex:

import (
    "sync"
)

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

func read(key string) (int, bool) {
    mu.RLock()         // zamknutie na čítanie
    defer mu.RUnlock() // odomknutie
    val, ok := m[key]
    return val, ok
}

func write(key string, val int) {
    mu.Lock()         // zamknutie na zápis
    defer mu.Unlock() // odomknutie
    m[key] = val
}

Ale použite 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 vhodný, keď je veľa konkurenčných operácií, ale má špecifické vlastnosti z hľadiska výkonu a API.