Golang并发和单通道阻塞,需要解释

Golang并发和单通道阻塞,需要解释,go,concurrency,Go,Concurrency,我在玩弄上面的代码。我的想法是,我可以通过去掉退出通道简化代码,并且仍然保持正确的程序行为——只是为了学习 以下是我得到的代码(为了更好的可读性,对其进行了进一步简化): 尽管我在调用SendNumber(c)之前故意添加了这一点。如果我把它改成 time.Sleep(1 * time.Second) 输出变为预期值: 0 1 所以,我对发生的事情感到困惑。有人能解释一下发生了什么事吗?在Go中,无论调用sendNumbers()需要多少时间,发送和接收都不应该被阻塞?在Go中,只要主函数

我在玩弄上面的代码。我的想法是,我可以通过去掉退出通道简化代码,并且仍然保持正确的程序行为——只是为了学习

以下是我得到的代码(为了更好的可读性,对其进行了进一步简化):

尽管我在调用SendNumber(c)之前故意添加了这一点。如果我把它改成

time.Sleep(1 * time.Second) 
输出变为预期值:

0
1

所以,我对发生的事情感到困惑。有人能解释一下发生了什么事吗?在Go中,无论调用sendNumbers()需要多少时间,发送和接收都不应该被阻塞?

在Go中,只要主函数返回,程序就会退出,而不管其他goroutine是否仍在运行。如果要确保主函数不会过早退出,则需要一些同步机制。

你不一定要使用同步原语,你也可以只使用通道,可以说这是一种更惯用的方法。

在Go中,只要主函数返回,程序就会退出,不管其他goroutine是否仍在运行。如果要确保主函数不会过早退出,则需要一些同步机制。
您不必绝对使用同步原语,您也可以只使用通道,这可以说是一种更惯用的方式;和.可能的副本;和。
time.Sleep(1 * time.Second) 
0
1