for ... range
по каналу завершается только после того, как все значения были получены от канала, и канал был закрыт.
В вашем примере вы будете sh, чтобы закрыть канал в отложенной функции, но это будет работать только тогда, когда main()
возвращается. Но main()
вернется, только если l oop закончится. Это причина тупика. for
l oop ожидает закрытия канала, а закрытие канала ожидает окончания l oop.
При использовании al oop для получения в точности 5 значений канал, он работает, потому что запущенные goroutines отправляет на него 5 значений. Этот l oop не ожидает закрытия канала, поэтому l oop может завершиться, как и функция main()
.
Вот почему sender следует закрыть канал (не приемник), и проблема будет решена немедленно:
func sendValues(myIntChannel chan int) {
for i := 0; i < 5; i++ {
myIntChannel <- i //sending value
}
close(myIntChannel)
}
func main() {
myIntChannel := make(chan int)
go sendValues(myIntChannel)
for value := range myIntChannel {
fmt.Println(value) //receiving value
}
}
Выход (попробуйте на Go Playground ):
0
1
2
3
4