gpt4 book ai didi

go - 范围使用是否需要 channel 容量?

转载 作者:行者123 更新时间:2023-12-01 20:25:41 26 4
gpt4 key购买 nike

我正在学习golang一段时间。我遇到了 channel 问题。
我有两个例子。它们看起来一样,但是其中1个给出了错误。
当我分配 channel 容量(转换为缓冲 channel )时,问题已解决,但其他示例未分配容量。

这是我的第一个问题。

第一个代码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)
}

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

从现在开始。

最佳答案

范围内的 channel 不需要对其进行缓冲。

Spec: Send statements:

Communication blocks until the send can proceed. A send on an unbuffered channel can proceed if a receiver is ready.



您的第二个示例:
queue := make(chan string)
queue <- "one"
queue <- "two"

如果 queue channel 未缓冲,则它的第一个发送将被阻塞,直到准备好从其接收另一个goroutine为止。但是您的应用程序中只有一个goroutine,只有在send:deadlock之后才从 channel 开始接收。

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

您的第一个示例也适用于非缓冲 channel ,因为发送和接收发生在2个并发goroutine中。

关于go - 范围使用是否需要 channel 容量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59618765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com