Как безопасно обновлять map результатов из workers

Обычная map Go не поддерживает несинхронизированную конкурентную запись и чтение. Защищайте все обращения одним протоколом locks либо передайте владение map одной goroutine.

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

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

Обычная map Go не поддерживает несинхронизированную конкурентную запись и чтение. Защищайте все обращения одним протоколом locks либо передайте владение map одной goroutine.

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

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

Условие

Несколько goroutines записывают в map[string]Result по ID задачи, а Status одновременно читает значения. Почему присваивания разным ключам недостаточно для безопасности?

Ответ

Обычная map Go не поддерживает несинхронизированную конкурентную запись и чтение. Защищайте все обращения одним протоколом locks либо передайте владение map одной goroutine.

Для варианта с mutex запись и чтение выполняются под соответствующей блокировкой; наружу возвращайте снимок, не изменяемые общие указатели. Вложенная map также требует инициализации и защиты. Конструкция tasksRes[id][task{...}] не заменяет присваивание: для простой map результата нужна форма tasksRes[id] = result.

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

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

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

Подробнее