我正在尝试创建一个简单的程序来学习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 {
        recievedMsg := <-c
        fmt.Println(recievedMsg)
    }
}

func main() {
    newChanel := make(chan int)
    printer(newChanel)
    reciever(newChanel)
}

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

提前致谢

最佳答案

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

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

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

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

10-07 20:33