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

“所有goroutine都在睡觉-死锁!打印机接收器程序中退出状态2”错误

“所有goroutine都在睡觉-死锁!打印机接收器程序中退出状态2”错误

Go
森栏 2021-05-11 14:15:39
我正在尝试创建一个简单的程序来学习Go中的频道。但是我遇到了死锁错误,我无法弄清楚package mainimport (    "fmt"    "time")func printer(c chan int) {    for i := 0; i < 10; i++ {        c <- i        time.Sleep(time.Second)    }}func reciever(c chan int) {    for {        recievedMsg := <-c        fmt.Println(recievedMsg)    }}func main() {    newChanel := make(chan int)    printer(newChanel)    reciever(newChanel)}我最初的想法是关于睡眠功能,但是即使我不包括此功能,我仍然会遇到此错误并退出消息。任何人都可以提出一些有关如何解决此问题的提示吗?
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

您需要两个执行线程,因为现在reciever无法调用该函数,因为您永远不会离开该printer函数。您需要在单独的goroutine上执行其中之一。


您还应该close在通道中使用该通道,并range在循环中使用该运算符,以使其在关闭通道时结束。


因此,我向您建议此代码:


func printer(c chan int) {

    for i := 0; i < 10; i++ {

        c <- i

        time.Sleep(time.Second)

    }

    close(c)

}


func reciever(c chan int) {

    for recievedMsg := range c {

        fmt.Println(recievedMsg)

    }

}


func main() {

    newChanel := make(chan int)

    go printer(newChanel)

    reciever(newChanel)

}


查看完整回答
反对 回复 2021-05-17
  • 1 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

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