Сначала будут напечатаны 1, 2, 3, 4, 5, затем бесконечная последовательность нулей. Чтение закрытого пустого канала не блокируется.
Какой вывод получит программа
Сначала будут напечатаны 1, 2, 3, 4, 5, затем бесконечная последовательность нулей. Чтение закрытого пустого канала не блокируется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой результат будет напечатан при выполнении следующей программы.
func main() {
numbersChan := make(chan int, 5)
for idx := 1; idx <= 5; idx++ {
numbersChan <- idx
}
close(numbersChan)
for true {
fmt.Println(<-numbersChan)
}
}
Ответ
Сначала будут напечатаны 1, 2, 3, 4, 5, затем бесконечная последовательность нулей. Чтение закрытого пустого канала не блокируется.
Закрытие не удаляет накопленные значения: пять элементов буфера сначала читаются в порядке отправки. После исчерпания буфера чтение немедленно возвращает нулевое значение int.
Исправьте цикл на for n := range numbersChan { fmt.Println(n) } либо используйте n, ok := <-numbersChan и завершайтесь при !ok. В данном примере panic от чтения закрытого канала не возникает; паника связана с отправкой в закрытый канал или повторным close.