Go 信道容量对于范围使用是否必要?

Go 信道容量对于范围使用是否必要?,go,channel,goroutine,Go,Channel,Goroutine,我在学习戈朗一段时间。我遇到了频道问题。 我有两个例子。它们看起来一样,但其中一个给出了错误。 当我分配信道容量时,转换到缓冲信道的问题得到解决,但其他示例并没有容量分配 这是我的第一个问题 第一代码 第二代码 如果您删除第二代码处的容量号,程序将无法运行,我不知道为什么。我认为对于范围迭代,有必要分配一个容量值,但还有另一个代码可以工作 从现在开始感谢。通过通道进行测距不需要缓冲 通信阻塞,直到发送可以继续。如果接收器已准备就绪,则无缓冲信道上的发送可以继续 你的第二个例子: queue :=

我在学习戈朗一段时间。我遇到了频道问题。 我有两个例子。它们看起来一样,但其中一个给出了错误。 当我分配信道容量时,转换到缓冲信道的问题得到解决,但其他示例并没有容量分配

这是我的第一个问题

第一代码

第二代码

如果您删除第二代码处的容量号,程序将无法运行,我不知道为什么。我认为对于范围迭代,有必要分配一个容量值,但还有另一个代码可以工作


从现在开始感谢。

通过通道进行测距不需要缓冲

通信阻塞,直到发送可以继续。如果接收器已准备就绪,则无缓冲信道上的发送可以继续

你的第二个例子:

queue := make(chan string)
queue <- "one"
queue <- "two"
如果队列通道未被缓冲,则其上的第一次发送将被阻止,直到有另一个goroutine准备从其接收。但是在你的应用程序中只有一个goroutine,它只会在发送之后才开始从通道接收:deadlock

当缓冲区为2时,通道最多可容纳2个值。因此,即使没有人准备好接收,也可以继续向其发送2个值。发送第三个值将再次阻塞


您的第一个示例也适用于无缓冲通道,因为发送和接收发生在两个并发goroutine上。

在通道上进行测距不需要对其进行缓冲

通信阻塞,直到发送可以继续。如果接收器已准备就绪,则无缓冲信道上的发送可以继续

你的第二个例子:

queue := make(chan string)
queue <- "one"
queue <- "two"
如果队列通道未被缓冲,则其上的第一次发送将被阻止,直到有另一个goroutine准备从其接收。但是在你的应用程序中只有一个goroutine,它只会在发送之后才开始从通道接收:deadlock

当缓冲区为2时,通道最多可容纳2个值。因此,即使没有人准备好接收,也可以继续向其发送2个值。发送第三个值将再次阻塞


您的第一个示例也适用于无缓冲通道,因为发送和接收发生在两个并发goroutine上。

哦,我明白了。谢谢你的回答。哦,我现在明白了。谢谢你的回答。
queue := make(chan string)
queue <- "one"
queue <- "two"