Несинхронный доступ к map из нескольких горутин

Нельзя гарантировать набор строк: конкурентные записи в обычную map создают гонку и могут завершиться аварией. Пауза пять секунд не делает доступ безопасным.

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

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

Нельзя гарантировать набор строк: конкурентные записи в обычную map создают гонку и могут завершиться аварией. Пауза пять секунд не делает доступ безопасным.

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

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

Условие

Определите, какой вывод появится в консоли, учитывая, что несколько горутин одновременно записывают значения в обычный map без какой‑либо синхронизации. Обратите внимание на возможные последствия гонки данных.

func main() {
    data := make(map[int]bool)
    for i := 0; i < 10; i++ {
        go func() {
            data[i] = true
        }()
    }

    time.Sleep(time.Second * 5)
    for k, v := range data {
        fmt.Println(k, v)
    }
}

Ответ

Нельзя гарантировать набор строк: конкурентные записи в обычную map создают гонку и могут завершиться аварией. Пауза пять секунд не делает доступ безопасным.

При старой семантике циклов добавляется общая i, при новой i разделены, но конкурентная map всё равно остаётся ошибкой. После записей необходимы mutex и WaitGroup либо передача результатов единственному владельцу карты.

Исправленный вариант может содержать ключи 0–9 со значением true, но порядок обхода map не определён. Если нужен отсортированный вывод, после завершения записей соберите и отсортируйте ключи. Фиксированный Sleep не заменяет ожидание через синхронизационный примитив.

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

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

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

Подробнее