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(即使在通道关闭时写入以正确退出循环)。