使用范围是否需要通道容量?



我正在研究golang一段时间。我遇到了频道问题。 我有两个例子。它们看起来相同,但其中 1 个给出错误。 当我分配通道容量(转换为缓冲通道(时,问题正在解决,但其他示例没有容量分配。

这是我的第一个问题。

第一个代码 https://play.golang.org/p/dbC7ZZsagin

// Creating a channel 
// Using make() function 
mychnl := make(chan string) 
// Anonymous goroutine 
go func() { 
mychnl <- "GFG"
mychnl <- "gfg"
mychnl <- "Geeks"
mychnl <- "GeeksforGeeks"
close(mychnl) 
}() 
// Using for loop 
for res := range mychnl { 
fmt.Println(res) 
} 

第二个代码 https://play.golang.org/p/yQMclmwOYs9

// We'll iterate over 2 values in the `queue` channel.
queue := make(chan string, 2)
queue <- "one"
queue <- "two"
close(queue)
// This `range` iterates over each element as it's
// received from `queue`. Because we `close`d the
// channel above, the iteration terminates after
// receiving the 2 elements.
for elem := range queue {
fmt.Println(elem)
}

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

谢谢。

在通道上测距不需要缓冲。

规格: 发送语句:

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

您的第二个示例:

queue := make(chan string)
queue <- "one"
queue <- "two"

如果queue通道没有缓冲,则它的第一个发送将阻塞,直到有另一个 goroutine 准备好从它接收。但是您的应用程序中只有一个 goroutine,只有在发送:死锁后才会开始从通道接收。

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

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

最新更新