
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 ikw 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 谢谢大家的分析! |