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

我正在尝试创建一个简单的程序来学习Go中的频道。但是我遇到了死锁错误,我无法弄清楚


package main


import (

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

}

我最初的想法是关于睡眠功能,但是即使我不包括此功能,我仍然会遇到此错误并退出消息。任何人都可以提出一些有关如何解决此问题的提示吗?


森栏
浏览 221回答 1
1回答

慕的地10843

您需要两个执行线程,因为现在reciever无法调用该函数,因为您永远不会离开该printer函数。您需要在单独的goroutine上执行其中之一。您还应该close在通道中使用该通道,并range在循环中使用该运算符,以使其在关闭通道时结束。因此,我向您建议此代码:func printer(c chan int) {&nbsp; &nbsp; for i := 0; i < 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; c <- i&nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Second)&nbsp; &nbsp; }&nbsp; &nbsp; close(c)}func reciever(c chan int) {&nbsp; &nbsp; for recievedMsg := range c {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(recievedMsg)&nbsp; &nbsp; }}func main() {&nbsp; &nbsp; newChanel := make(chan int)&nbsp; &nbsp; go printer(newChanel)&nbsp; &nbsp; reciever(newChanel)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go