Sobes.tech
Back to questions
Intern
8

Читать map потокобезопасно в Go?

Companies where asked
Adapty

Answer from AI

sobes.tech AI

В Go чтение из map не является потокобезопасным, если одновременно происходит запись. Чтобы безопасно читать из map в многопоточной среде, нужно использовать синхронизацию, например, sync.RWMutex для блокировки на чтение и запись, или использовать sync.Map, который специально разработан для конкурентного доступа.

Пример с sync.RWMutex:

import (
    "sync"
)

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

func read(key string) (int, bool) {
    mu.RLock()         // блокировка на чтение
    defer mu.RUnlock() // разблокировка
    val, ok := m[key]
    return val, ok
}

func write(key string, val int) {
    mu.Lock()         // блокировка на запись
    defer mu.Unlock() // разблокировка
    m[key] = val
}

Или использовать 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 удобен, когда много конкурентных операций, но имеет особенности по производительности и API.