打印机 - 接收器程序中的"所有goroutine都睡着了 - 死锁!退出状态2"错误

min*_*ner 6 channel go

我正在尝试创建一个简单的程序来学习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)
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢

Den*_*ret 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)
}
Run Code Online (Sandbox Code Playgroud)