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