Нужно завершать чтение по признаку закрытия канала, а не продолжать печатать сохранённое значение. Закрытый пустой канал сразу возвращает нулевое значение и ok=false, а не последний элемент.
Не прекращающийся вывод финального числа из канала
Нужно завершать чтение по признаку закрытия канала, а не продолжать печатать сохранённое значение. Закрытый пустой канал сразу возвращает нулевое значение и ok=false, а не последний элемент.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеются три функции: Generate() — генерирует последовательность чисел и отправляет их в канал. readChan() — извлекает данные из канала и выполняет их обработку. printer() — выводит текущее значение в консоль. Проблема: После того как все элементы из канала были считаны и обработаны, последнее значение продолжает выводиться бесконечно. Необходимо объяснить, почему возникает такой эффект, и предложить исправление.
Ответ
Нужно завершать чтение по признаку закрытия канала, а не продолжать печатать сохранённое значение. Закрытый пустой канал сразу возвращает нулевое значение и ok=false, а не последний элемент.
Без исходного кода нельзя установить точную причину печати именно последнего числа. Типичное исправление потребителя:
for value := range ch {
fmt.Println(value)
}
Generate закрывает канал после отправки всех чисел. Если readChan и printer разделены, закрытие нужно передать дальше и остановить цикл printer. При ручном чтении проверяйте value, ok := <-ch; ветка default или внешний бесконечный цикл не должны бесконечно выводить устаревшую переменную.