```
package main
import (
"fmt"
"sync"
)
func main() {
wg := sync.WaitGroup{}
var ret = make(chan int)
for i := 0; i < 100; i++ {
wg.Add(1)
go func(i int) {
ret <- i
wg.Done()
}(i)
}
go func() {
defer close(ret)
wg.Wait()
}()
fmt.Println("执行结束")
for v := range ret {
fmt.Println(v)
}
}
```
上段代码中
```
go func() {
defer close(ret)
wg.Wait()
}()
```
为什么不能替换成:
```
wg.Wait()
close(ret)
```
更多评论
我自己想应该是使用
```
wg.Wait()
close(ret)
```
阻碍的主线程,但是同时遍历是发生在主线程上。这时候定义的channel是无缓存的,这时候没办法发现这个无缓冲的channel又被消费的可能,故而会发生异常。这时候使用 协程的话,由于不堵塞。使得 channel消费成为的可能。
```
go func() {
defer close(ret)
wg.Wait()
}()
```
#1