频道什么时候阻止goroutine

频道什么时候阻止goroutine,go,goroutine,Go,Goroutine,如果我定义了一个没有缓冲区的通道,并将一个数据写入其中,那么它是否会立即阻塞,以便内核将查找另一个从该通道读取的未阻塞goroutine,或者当下一次某些代码试图再次写入该通道时,它是否会继续执行并阻塞,而该通道尚未读取 下面是我为研究这个问题而编写的两段代码 代码1: 包干管 进口fmt func main{ c:=makechan int 围棋{ 对于i:=0;i

如果我定义了一个没有缓冲区的通道,并将一个数据写入其中,那么它是否会立即阻塞,以便内核将查找另一个从该通道读取的未阻塞goroutine,或者当下一次某些代码试图再次写入该通道时,它是否会继续执行并阻塞,而该通道尚未读取

下面是我为研究这个问题而编写的两段代码

代码1:

包干管 进口fmt func main{ c:=makechan int 围棋{ 对于i:=0;i<3;i++{
c发送到没有可用缓冲空间的通道会阻塞发送方,直到发送可以完成;从没有可用消息的通道接收会阻塞接收方,直到接收可以完成。无缓冲的通道在接收前不会有缓冲空间-发送阻塞,反之亦然。这在围棋教程中介绍:


请记住,您的代码是并发的,因此您不能对输出语句的顺序进行太多的读取。在发送/接收操作和将消息打印到标准输出之间,可以将goroutine置于休眠状态。

此外,在我看来,源代码非常可读,因为它处于go!!!:这可能有助于您理解如何中断接收into一个单独的变量j:=谢谢你澄清。我试图分析操作顺序,但完全忘记了它可以是任何东西,因为它们是并发的。经过验证,OP从第一个代码获得的输出肯定是可能的输出之一。
number 0 inserted into channel
number poped from channel 0
number poped from channel 1
number 1 inserted into channel
number 2 inserted into channel
number poped from channel 2
fatal error: all goroutines are asleep - deadlock!