Value имеет тип Message, указанный в параметре. При запуске goroutine вычисляется аргумент msg, поэтому функция получает значение этой итерации независимо от последующих присваиваний.
Зачем передавать сообщение аргументом goroutine
Value имеет тип Message, указанный в параметре. При запуске goroutine вычисляется аргумент msg, поэтому функция получает значение этой итерации независимо от последующих присваиваний.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Цикл for _, msg := range messages запускает go func(value Message){ send(value) }(msg). Какой тип у value и почему явная передача бывает полезна?
Ответ
Value имеет тип Message, указанный в параметре. При запуске goroutine вычисляется аргумент msg, поэтому функция получает значение этой итерации независимо от последующих присваиваний.
Это также делает зависимость callback явной и не зависит от старых правил захвата переменных цикла. Копирование структуры остаётся поверхностным: slice, map и указатели внутри могут ссылаться на общую изменяемую память. Если send и производитель меняют эти данные одновременно, одной передачи аргументом для устранения гонки недостаточно.