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