func main() {
ch := make(chan int)
for i := 0; i < 5; i++ {
i := i
go func() {
ch <- i
close(ch)
}()
}
for c := range ch {
println(c)
}
}
这个代码片段其实是有问题的, 下面贴上相对合理的代码
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}()
for c := range ch {
println(c)
}
1
996635 2020-09-14 11:28:09 +08:00
不是你自己 close 的么?
|
2
zwpaper 2020-09-14 11:33:19 +08:00
`close(ch)`
你关了 5 次 ch,看 6 个 Goroutine 的调度顺序,只要有 一个 ch <- i 在 close 之后执行,就 panic 你肯定会问为什么有时候会正常退出,因为在 close 之后,range ch 先执行,然后 main 退出,其它 ch <- i 没有被执行到 |
3
monkeyWie 2020-09-14 11:35:32 +08:00
改一下:
``` func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(5) go func() { wg.Wait() close(ch) }() for i := 0; i < 5; i++ { i := i go func() { ch <- i wg.Done() }() } for c := range ch { println(c) } } ``` |
4
monkeyWie 2020-09-14 11:38:44 +08:00
这代码格式化我裂开了,还是直接贴链接吧: https://play.golang.org/p/kY32r_P92Gh
|
5
raaaaaar 2020-09-14 12:10:12 +08:00 via Android
你不能保证两个循环谁先结束
|
6
araraloren 2020-09-14 13:28:15 +08:00
这是自己都没搞懂代码逻辑。。
|
7
MajorAdam 2020-09-14 13:30:29 +08:00
娜塔莉的头像
|
10
qiqiyeshi OP 谢谢大家的分析!
|