【问题标题】:Is channel capacity necessary for range usage?范围使用是否需要通道容量?
【发布时间】:2020-04-24 09:21:49
【问题描述】:

我正在学习 golang 一段时间。我遇到了频道问题。 我有2个例子。它们看起来相同,但其中 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)
}

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

从现在开始谢谢。

【问题讨论】:

    标签: go channel goroutine


    【解决方案1】:

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

    Spec: Send statements:

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

    你的第二个例子:

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

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

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

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

    【讨论】:

    • 哦,我明白了。感谢您的回答。
    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多