为了账号安全,请及时绑定邮箱和手机立即绑定

尝试使用“范围”打印通道值后出现死锁

尝试使用“范围”打印通道值后出现死锁

Go
慕桂英546537 2021-09-13 10:42:07
这是我在Go Playground 的代码package mainimport (    "fmt")func sum_up(my_int int, cs chan int) {    my_sum := 0    for i := 0; i < my_int; i++ {        my_sum += i    }    cs <- my_sum}func main() {    my_channel := make(chan int)    for i := 2; i < 5; i++ {         go sum_up(i, my_channel)    }    for ele := range my_channel {        fmt.Println(ele)    }      //fatal error: all goroutines are asleep - deadlock!    fmt.Println("Done")}结果是:136fatal error: all goroutines are asleep - deadlock!我不明白是什么导致了错误。我的理解是,在我的函数中,sum_up我正在向my_channel. 为什么在我尝试打印出值后会出现问题?由于我看到 1,3,6 被打印,这意味着所有goroutines都已成功完成。此外,如果试图打印通道值的块    for ele := range my_channel {        fmt.Println(ele)    }被删除,然后我没有收到错误。所以它包括导致错误的块,但为什么呢?
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

for range chan当 chan 收到关闭信号时退出。你必须在close(my_channel)某个地方,否则循环将永远等待。


查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信