goroutine 内でループさせてチャンネルで受けとってみる
func main() {
ch := make(chan int)
defer close(ch)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
}()
for n := range ch {
println(n)
}
}
これ、いけそうなんだけど一番最後にエラーが表示される
fatal error: all goroutines are asleep - deadlock!
さっき覚えた sync.WaitGroup ではどうか
import "sync"
func main() {
ch := make(chan int)
defer close(ch)
wg := &sync.WaitGroup{}
wg.Add(2)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
wg.Done()
}()
go func() {
for n := range ch {
println(n)
}
wg.Done()
}()
wg.Wait()
}
これもやはり同じエラーが発生する。
(deferをコメントアウトしたら正常に動作したと記載していたが、間違い)
[追記]
コメントで指摘していただいた点を反映してみると正常動作した。
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // ここでclose
}()
for n := range ch {
println(n)
}
}