Корректного предсказуемого результата нет: конкурентные записи в обычную map создают data race и могут аварийно завершить программу.
Определение результата конкурентной записи в одну ячейку map
Корректного предсказуемого результата нет: конкурентные записи в обычную map создают data race и могут аварийно завершить программу.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно понять, какое значение окажется в ячейке отображения после того, как несколько горутин одновременно попытаются записать в неё разные числа.
m := make(map[int]int, 1)
go func() { m[1] = 2 }()
go func() { m[1] = 7 }()
go func() { m[1] = 10 }()
time.Sleep(100 * time.Millisecond)
fmt.Println("m[1] =", m[1])
Ответ
Корректного предсказуемого результата нет: конкурентные записи в обычную map создают data race и могут аварийно завершить программу.
Даже запись в один и тот же ключ требует синхронизации. Sleep не образует отношения happens-before и не делает последующее чтение безопасным; возможны и диагностические ошибки concurrent map writes.
Защитите все чтения и записи mutex и дождитесь работников через WaitGroup. Тогда значение будет одним из записанных, но без установленного порядка нельзя заранее выбрать 2, 7 или 10. Если нужен конкретный победитель, порядок или приоритет необходимо описать явно.