Блокировка записи в небуферный канал

Сначала появится main() started, затем программа заблокируется на c <- "John" и runtime сообщит о deadlock. main() stopped не выполнится.

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

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

Сначала появится main() started, затем программа заблокируется на c <- "John" и runtime сообщит о deadlock. main() stopped не выполнится.

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

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

Условие

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

package main

import "fmt"

func main() {
 fmt.Println("main() started")

 c := make(chan string)
 c <- "John"

 fmt.Println("main() stopped")
}

Ответ

Сначала появится main() started, затем программа заблокируется на c <- "John" и runtime сообщит о deadlock. main() stopped не выполнится.

Отправка в небуферизированный канал требует одновременно готового получателя. В программе нет ни другой горутины, ни чтения из c, поэтому операция не может завершиться.

Решение зависит от задачи: запустить получателя с корректным ожиданием его завершения или использовать буфер, если требуется временно сохранить значение. Само создание буферизированного канала не означает, что данные кто-то обработал; если обработка обязательна, нужно отдельное подтверждение или ожидание.

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

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

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

Подробнее