Одновременное чтение и запись в map в Go

Одновременное несогласованное чтение и запись обычной map недопустимы: это data race, возможен fatal error concurrent map read and map write.

Короткий ответ

Что ответить на собеседовании

Одновременное несогласованное чтение и запись обычной map недопустимы: это data race, возможен fatal error concurrent map read and map write.

Подробный разбор

Ответ с пояснениями

Условие

Что происходит, если из разных горутин одновременно выполнять операции чтения и записи в map? Появятся ли ошибки, и существуют ли какие‑либо ограничения?

var data = map[string]int{"a": 1}

func main() {
    go reader()
    time.Sleep(1 * time.Second)
    go writer()
    time.Sleep(1 * time.Second)
}

func reader() {
    for {
        fmt.Println(data["a"])
    }
}

func writer() {
    for {
        data["a"] = 2
    }
}

Ответ

Одновременное несогласованное чтение и запись обычной map недопустимы: это data race, возможен fatal error concurrent map read and map write.

Sleep лишь откладывает запуск writer и не защищает reader после его старта. Даже один постоянно перезаписываемый ключ требует синхронизации; авария не обязана проявляться в каждом запуске.

Используйте один RWMutex для обеих сторон, sync.Map под подходящий сценарий либо единственную горутину-владельца. Несколько читателей безопасны, если map больше никто не меняет и её публикация синхронизирована. Бесконечные циклы также нуждаются в управляемом завершении, а печать на каждой итерации создаёт ненужную нагрузку.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее