Отправка пустой структуры по каналу и её чтение в горутине

main блокируется на отправке в небуферизированный канал раньше запуска получателя. В самостоятельной программе возникает deadlock, ничего не печатается.

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

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

main блокируется на отправке в небуферизированный канал раньше запуска получателя. В самостоятельной программе возникает deadlock, ничего не печатается.

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

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

Условие

Необходимо выяснить, какой вывод появится в консоли, когда пустая структура передаётся в канал и затем извлекается из него в отдельной горутине.

func main() {
    ch := make(chan struct{})
    ch <- struct{}{}

    go func() {
        fmt.Println(<-ch)
    }()
}

Ответ

main блокируется на отправке в небуферизированный канал раньше запуска получателя. В самостоятельной программе возникает deadlock, ничего не печатается.

Оператор go расположен после блокирующей отправки и никогда не достигается. Создайте горутину-получателя до отправки и дождитесь её окончания, например отдельным каналом done.

Буфер вместимости 1 уберёт первую блокировку, но сам по себе не гарантирует вывод: main может закончиться прежде, чем горутина выполнит Println. При корректной синхронизации полученная пустая структура отображается как {}. Закрытие канала для передачи единственного значения не обязательно.

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

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

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

Подробнее