Нельзя гарантировать набор строк: конкурентные записи в обычную 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 не заменяет ожидание через синхронизационный примитив.