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

这是我在Go Playground 的代码


package main


import (

    "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")


}

结果是:


1

3

6

fatal error: all goroutines are asleep - deadlock!

我不明白是什么导致了错误。我的理解是,在我的函数中,sum_up我正在向my_channel. 为什么在我尝试打印出值后会出现问题?由于我看到 1,3,6 被打印,这意味着所有goroutines都已成功完成。


此外,如果试图打印通道值的块


    for ele := range my_channel {

        fmt.Println(ele)

    }

被删除,然后我没有收到错误。所以它包括导致错误的块,但为什么呢?


慕桂英546537
浏览 200回答 3
3回答

慕尼黑的夜晚无繁华

for range chan当 chan 收到关闭信号时退出。你必须在close(my_channel)某个地方,否则循环将永远等待。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go