Поведение каналов и горутин в простом примере

Программа заблокируется на отправке в небуферизированный канал до запуска принимающей горутины. В обычной отдельной программе 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.

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

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

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

Подробнее