Зачем передавать сообщение аргументом goroutine

Value имеет тип Message, указанный в параметре. При запуске goroutine вычисляется аргумент msg, поэтому функция получает значение этой итерации независимо от последующих присваиваний.

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

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

Value имеет тип Message, указанный в параметре. При запуске goroutine вычисляется аргумент msg, поэтому функция получает значение этой итерации независимо от последующих присваиваний.

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

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

Условие

Цикл for _, msg := range messages запускает go func(value Message){ send(value) }(msg). Какой тип у value и почему явная передача бывает полезна?

Ответ

Value имеет тип Message, указанный в параметре. При запуске goroutine вычисляется аргумент msg, поэтому функция получает значение этой итерации независимо от последующих присваиваний.

Это также делает зависимость callback явной и не зависит от старых правил захвата переменных цикла. Копирование структуры остаётся поверхностным: slice, map и указатели внутри могут ссылаться на общую изменяемую память. Если send и производитель меняют эти данные одновременно, одной передачи аргументом для устранения гонки недостаточно.

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

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

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

Подробнее