Что происходит при чтении из пустого буферизованного канала в Go и записи в него другой горутиной
Что проверяют
Понимаете ли вы блокирующую семантику каналов и то, что буфер меняет поведение отправителя, а не получателя. Дальше обычно идут вопросы про закрытый и нулевой канал, поэтому их лучше назвать самому.
Как отвечать
Приём из пустого канала блокирует горутину, и буфер тут ничего не меняет: пустой буферизованный канал для читателя ведёт себя так же, как небуферизованный. Буфер важен отправителю, пока в нём есть место, отправка не ждёт приёмника.
Заблокированная горутина не крутит цикл ожидания: рантайм снимает её с потока, ставит в очередь ожидания канала и разбудит, когда придёт значение. Стоимость такого ожидания близка к нулю, поток тем временем выполняет другие горутины.
Когда вторая горутина пишет, значение передаётся напрямую ожидающему, и модель памяти даёт гарантию: всё, что записано до отправки, видно после приёма.
ch := make(chan int, 1)
go func() { ch <- 42 }()
v := <-ch // ждём, пока горутина запишетПограничные случаи: из закрытого канала приём возвращает нулевое значение сразу, а v, ok := <-ch даёт ok равным false; закрывает всегда отправитель, повторное закрытие и запись в закрытый канал это паника; нулевой канал блокирует навсегда и на чтении, и на записи, чем удобно выключать ветку select. Если уснули вообще все горутины, рантайм печатает фатальную ошибку про дедлок.
Где спотыкаются
Считают, что буфер делает приём неблокирующим. Неблокирующее чтение получается только через select с веткой default, а ограниченное по времени через time.After или ctx.Done().
Не продумывают завершение. Читатель ждёт больше значений, чем отправит писатель, и программа встаёт, либо наоборот, читатель уходит раньше и часть данных теряется. Нужен close с range по каналу или счётчик ожидания.
Доказывают порядок печатью из горутины после отправки. После приёма основная горутина продолжает работу и способна завершить программу раньше, чем отправитель допечатает свою строку, так что вывод пропадает и на нём строят неверные выводы.