Оптимизация и рефакторинг Go‑кода с каналом

Запустите отправляющую горутину до чтения и закройте канал после последнего значения. Тогда range завершится вместо вечного ожидания.

Короткий ответ

Что ответить на собеседовании

Запустите отправляющую горутину до чтения и закройте канал после последнего значения. Тогда range завершится вместо вечного ожидания.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо улучшить структуру программы, убрав потенциальные проблемы с блокировками и сделать её более читаемой.

func main() {
    dataCh := make(chan int)

    for val := range dataCh {
        fmt.Println(val)
    }

    go func() {
        dataCh <- 1
        dataCh <- 2
        dataCh <- 3
    }()
}

Ответ

Запустите отправляющую горутину до чтения и закройте канал после последнего значения. Тогда range завершится вместо вечного ожидания.

Исправленный порядок:

func main() {
    dataCh := make(chan int)
    go func() {
        defer close(dataCh)
        dataCh <- 1
        dataCh <- 2
        dataCh <- 3
    }()
    for value := range dataCh { fmt.Println(value) }
}

Нужны package main и импорт fmt. В исходнике main блокируется в range, не доходя до отправителя. Без close после третьего значения цикл снова ждал бы данные. Канал закрывает единственный отправитель, не получатель.

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

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

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

Подробнее