示例代码
func main() { res := make(chan int, 3) for i := 0; i < 3; i++ { go func(num int) { res <- num }(i) } for v := range res { fmt.Println(v) } defer close(res) fmt.Println("main end") }
示例代码会输出
0 1 2 fatal error: all goroutines are asleep - deadlock! //线程睡死了。。
//希望得到输出
0 1 2 main end //主线程输出
这个问题怎么解决,刚学习 channel goroutines 组合使用
自己搞定了
func main() { res := make(chan int, 3) var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) go func(n int) { defer wg.Done() res <- n }(i) } wg.Wait() close(res) for v := range res{ fmt.Println(v) } fmt.Println("main is end") }
![]() | 1 yiplee 2020-04-28 10:19:38 +08:00 deadlock 的原因是 ```golang for v := range res { fmt.Println(v) } ``` 这里在一直消费 res,消费了三次之后消费完了就一直等待了,程序卡死在这。 |