Программа напечатает 1, 2, 3, 4, 5 и затем заблокируется на шестом чтении. Канал пуст, но не закрыт, отправителей больше нет.
Какой вывод получит программа
Программа напечатает 1, 2, 3, 4, 5 и затем заблокируется на шестом чтении. Канал пуст, но не закрыт, отправителей больше нет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какие значения будут напечатаны при запуске следующего Go‑кода, использующего буферизированный канал.
func main() {
ch := make(chan int, 5)
for i := 1; i <= 5; i++ {
ch <- i
}
for true {
fmt.Println(<-ch)
}
}
Ответ
Программа напечатает 1, 2, 3, 4, 5 и затем заблокируется на шестом чтении. Канал пуст, но не закрыт, отправителей больше нет.
Буфер хранит пять значений в порядке отправки. В отличие от закрытого канала, открытый пустой канал не возвращает бесконечные нули: чтение ждёт новое значение.
В данной самостоятельной программе runtime сообщит о deadlock. Можно закрыть ch после заполнения и читать через range, либо выполнить ровно пять чтений. Одного close при сохранении бесконечного цикла недостаточно: тогда после пяти чисел он бесконечно печатал бы нули.