Goroutine阻止程序结束

Goroutine阻止程序结束,go,Go,我正在进行围棋之旅,这段代码真的融化了我的心: 主程序包 输入“fmt” func-fibonacci(c,int){ x、 y:=0,1 为了{ 挑选{ 太长了,读不下去了 由于您从未向quit频道写入任何内容,因此您的程序在select case语句中不断生成值,并将它们添加到c频道,而没有使用者 解释 代码正在等待将某些内容添加到quit频道。由于没有写入,程序将继续计算斐波那契序列 并发编程与“标准”线性编程非常不同 您删除的行将保证quit通道中有足够的数据来结束程序,因为fib功能仅

我正在进行围棋之旅,这段代码真的融化了我的心:

主程序包
输入“fmt”
func-fibonacci(c,int){
x、 y:=0,1
为了{
挑选{
太长了,读不下去了
由于您从未向
quit
频道写入任何内容,因此您的程序在
select case
语句中不断生成值,并将它们添加到
c
频道,而没有使用者

解释 代码正在等待将某些内容添加到
quit
频道。由于没有写入,程序将继续计算斐波那契序列

并发编程与“标准”线性编程非常不同

您删除的行将保证
quit
通道中有足够的数据来结束程序,因为
fib
功能仅在从该通道读取时结束

{//无限循环的


案例c程序直到
main
返回才结束。你创建了死锁,所以运行时告诉你了。@JimB我不明白,什么是死锁?感谢你解释得很好的回答,它消除了我的困惑。不过我不得不问一下,你提到没有数据被添加到
c
频道,即使有数据被添加在第一种情况下添加。这是否意味着如果没有接收器,则无法向发送方添加数据?很抱歉,我错误地读取了
,因为I:=0;I<5;I++
循环。此循环从
c
通道读取五个“数据”,并结束。此后,
fibonacci
函数上的无限循环不断生成值并添加它们到频道。你的程序没有卡住,只是没有结束。你的编辑不是很准确,根据定义,这仍然是一个死锁,堆栈跟踪甚至可以准确地显示阻塞操作发生的位置。
fibonacci
函数在
select
中被阻塞,
main
是阻塞等待
fibonacci>
返回。如果仍有某些内容“生成”值,则不会出现死锁,因为某些goroutine将继续运行。@kwevelis:来自巡更本身:“默认情况下,发送和接收块,直到另一端准备就绪”。这就是如何使用通道在goroutine之间进行同步。@JimB感谢您的回复。我的困惑是-尽管我知道这是一个死锁(在错误消息中)-我不知道我为什么会得到它。我想如果
main
线程中没有更多的代码可执行,程序将忽略所有通道和goroutine,然后结束。根据您的解释和@rafadeboas的解释,我的理解是
main
线程将阻塞,等待来自的响应一种
select
情况。由于
select
卡在一个无限循环中,只需向通道添加值,而另一端没有任何接收器