```
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是阻塞的 是需要等待上面 100个阻塞的 goroutine 执行完成之后 才能继续往下执行
但是这100个 goroutine 可以完成的前提是 ret 这个chanel的数据 呗读取 就是需要下面的 range 来执行 才可以 让这goroutine 完成
但是 wg.wait 阻塞了 就没法继续往下执行下去
#4
更多评论
我自己想应该是使用
```
wg.Wait()
close(ret)
```
阻碍的主线程,但是同时遍历是发生在主线程上。这时候定义的channel是无缓存的,这时候没办法发现这个无缓冲的channel又被消费的可能,故而会发生异常。这时候使用 协程的话,由于不堵塞。使得 channel消费成为的可能。
```
go func() {
defer close(ret)
wg.Wait()
}()
```
#1