Go程序不会死锁,但也不会返回
随附的要点是一个简单的节目,使用生产者/多消费者模式中的频道。出于某种原因Go程序不会死锁,但也不会返回,go,channels,Go,Channels,随附的要点是一个简单的节目,使用生产者/多消费者模式中的频道。出于某种原因 go run channels.go打印所有结果,但不返回(并且不会死锁,或者至少go不会让我担心死锁发生。) 类型walkietalkie结构{ in chan int out chan int 退出陈波 } 变量项[]int=[]int{ 0, 1, 2, 3, 4, 5, } func work1(q walkietalkie){ 为了{ 挑选{ 案例a,更多:=您有一些问题 对于1,从具有多个返回值的通道读取,如
go run channels.go
打印所有结果,但不返回(并且不会死锁,或者至少go不会让我担心死锁发生。)
类型walkietalkie结构{
in chan int
out chan int
退出陈波
}
变量项[]int=[]int{
0, 1, 2, 3, 4, 5,
}
func work1(q walkietalkie){
为了{
挑选{
案例a,更多:=您有一些问题
对于1,从具有多个返回值的通道读取,如
case a, more := <-q.in
案例a,更多:=您有一些问题
对于1,从具有多个返回值的通道读取,如
case a, more := <-q.in
case a,more:=在这里发布代码。主函数在收到所有值后在一个紧密的循环中旋转。select语句毫无意义。似乎您正在寻找。main
运行直到results
关闭,但是results
直到main
返回才关闭。因此,中的最终for
循环de>main
将永远运行。即使它被正确关闭,默认值:break
只会从select
中中断,而不会从for
中中断,因此它仍然会永远运行。将代码发布到此处。主函数在接收到所有值后会在一个紧密的循环中旋转。select语句毫无意义。看起来您是查找。main
将一直运行,直到results
关闭,但是results
直到main
返回才关闭。因此,main
中最后的for
循环将永远运行。即使它正确关闭,默认值:break
仅从select
中中断,而不是从for
,因此它仍将永远运行。除了results
在main
返回之前不会关闭,使其成为写入时的catch-22(即使它被写入以在通道关闭时正确退出循环)。除此之外,results
在main
返回之前不会关闭,使其成为写入时的catch-22(即使在通道关闭时写入以正确退出循环)。