&引用;所有的Goroutine都睡着了-死锁!退出状态2“;打印机接收器程序中的错误

&引用;所有的Goroutine都睡着了-死锁!退出状态2“;打印机接收器程序中的错误,go,channel,Go,Channel,我正在尝试创建一个简单的程序来学习围棋中的频道。 但是我遇到了一个死锁错误,我无法理解 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 {

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

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)
}
主程序包
进口(
“fmt”
“时间”
)
func打印机(c chan int){
对于i:=0;i<10;i++{

c您需要两个执行线程,因为现在无法调用
receiver
函数,因为您从未离开
printer
函数。您需要在单独的goroutine上执行其中一个线程

您还应该
关闭
频道,并在循环中使用
范围
操作符,以便在频道关闭时结束

因此,我建议您使用以下代码:

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)
}
func打印机(c chan int){
对于i:=0;i<10;i++{

c谢谢。我根据你的提示修改了它,并且打印了0-9的所有数字,但之后我得到了相同的错误。我还添加了:var输入字符串fmt.Scanln(&input)但在打印数字后,我也会遇到同样的错误。知道我做错了什么吗?除了使打印机成为一个go例程之外,我还添加了“go Receiver”,然后它会无错误地打印0-9。我编辑了一些内容,以精确说明在频道关闭时应该如何关闭频道并结束接收。它看起来更干净(并且更可重复使用)。