Получение из небуферизованного канала (такого как ваш), где никто не готов отправить блоки значений. Это то, что вы испытываете. Спецификация: Оператор получения:
Выражение [<-c
] блокируется до тех пор, пока значение не станет доступным.
Распространенным способом подачи сигнала «EOF» в случае каналов является закрытие канала со стороны отправителя, когда больше нет значений для отправки, с помощью встроенной функции close()
.
Попытка получения из закрытого канала может быть продолжена немедленно, что дает нулевое значение типа элемента канала. Чтобы обнаружить это «закрытое» состояние, используйте специальную идиому comma-ok:
value, ok := <- c
Если канал закрыт, ok
будет false
(в противном случае это true
).
Простой и правильный способ «стравить» канал до его закрытия - использовать цикл for range
, например:
for value := range c {
fmt.Println("Received:", value)
}
for range
завершается после получения всех значений из канала c
, которые были отправлены на него до его закрытия.
Итак, внутри generateRows()
, сделайте так:
go func() {
// // Use defer so it will be closed no matter how this function call ends
defer close(c)
// ...
}()
А ваши main()
:
func main() {
c := generateRows("boring!!")
for v := range c {
fmt.Println(v)
}
fmt.Println("Bye")
}