我有以下Go代码
ExampleDto[]
运行此代码时,出现错误致命错误:所有goroutine都在睡眠中-死锁!。但是,当我取消注释上方 Cheat 函数中的 go func()行时,错误消失了。我不明白为什么错误在第一种情况下会出现,为什么在使用goroutine时错误会消失。所以,如果有人可以解释一下呢?
答案 0 :(得分:2)
在此简化示例中:
func Cheat(guess chan Choice) chan Choice {
new_guess := make(chan Choice)
new_guess <- Choice{}
<-guess
return new_guess
}
对新分配的通道进行写操作时,其他任何人都不可能拥有该通道,因此写操作将永远阻塞。由于该写块,从guess
读取永远不会发生。但是,在您引用的代码中,Cheat()
函数是唯一从guess
通道读取的内容;因此,正在发生的读取操作会阻止正在写入的内容,直到对new_guess
的写入操作才会发生读取操作,并且直到包含函数返回时才发生写入操作。
如果将通道I / O移至goroutine,则包含功能可以在事情进展之前返回,因此Cheat()
中的写入与Game()
结尾处的读取配对,并且事情可以向前发展。