Запустите отправляющую горутину до чтения и закройте канал после последнего значения. Тогда range завершится вместо вечного ожидания.
Оптимизация и рефакторинг Go‑кода с каналом
Запустите отправляющую горутину до чтения и закройте канал после последнего значения. Тогда 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 после третьего значения цикл снова ждал бы данные. Канал закрывает единственный отправитель, не получатель.