main блокируется на отправке в небуферизированный канал раньше запуска получателя. В самостоятельной программе возникает deadlock, ничего не печатается.
Отправка пустой структуры по каналу и её чтение в горутине
main блокируется на отправке в небуферизированный канал раньше запуска получателя. В самостоятельной программе возникает deadlock, ничего не печатается.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо выяснить, какой вывод появится в консоли, когда пустая структура передаётся в канал и затем извлекается из него в отдельной горутине.
func main() {
ch := make(chan struct{})
ch <- struct{}{}
go func() {
fmt.Println(<-ch)
}()
}
Ответ
main блокируется на отправке в небуферизированный канал раньше запуска получателя. В самостоятельной программе возникает deadlock, ничего не печатается.
Оператор go расположен после блокирующей отправки и никогда не достигается. Создайте горутину-получателя до отправки и дождитесь её окончания, например отдельным каналом done.
Буфер вместимости 1 уберёт первую блокировку, но сам по себе не гарантирует вывод: main может закончиться прежде, чем горутина выполнит Println. При корректной синхронизации полученная пустая структура отображается как {}. Закрытие канала для передачи единственного значения не обязательно.