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)
}
}
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)
}
|
996635Sep 14, 2020
1
不是你自己 close 的么?
|
|
ikwSep 14, 2020
2
`close(ch)`
你关了 5 次 ch,看 6 个 Goroutine 的调度顺序,只要有 一个 ch <- i 在 close 之后执行,就 panic 你肯定会问为什么有时候会正常退出,因为在 close 之后,range ch 先执行,然后 main 退出,其它 ch <- i 没有被执行到 |
|
monkeyWieSep 14, 2020
3
改一下:
``` 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) } } ``` |
|
monkeyWieSep 14, 2020
4
这代码格式化我裂开了,还是直接贴链接吧: https://play.golang.org/p/kY32r_P92Gh
|
|
raaaaaarSep 14, 2020 via Android
5
你不能保证两个循环谁先结束
|
|
araralorenSep 14, 2020
6
这是自己都没搞懂代码逻辑。。
|
|
MajorAdamSep 14, 2020
7
娜塔莉的头像
|
|
10
谢谢大家的分析!
|