Какой вывод получит программа

Программа напечатает 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 при сохранении бесконечного цикла недостаточно: тогда после пяти чисел он бесконечно печатал бы нули.

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

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

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

Подробнее