&引用;所有的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。我编辑了一些内容,以精确说明在频道关闭时应该如何关闭频道并结束接收。它看起来更干净(并且更可重复使用)。