为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中使用通道的斐波那契数列

Go 中使用通道的斐波那契数列

Go
MMTTMM 2021-10-11 13:45:50
我正在关注 tour.golang.org 上的示例。我主要理解这个例子,我唯一的问题是为什么当我们通过 0 退出频道时它会停止?不管是否传递了 0 来退出,x 总是有一个值。所以不应该选择总是落在 case 'c <- x' 上吗?func fibonacci(c chan int, quit chan int) {    x, y := 0, 1    for {        select {        case c <- x:            x, y = y, x+y        case <-quit:            return        }    }    close(c)}func main() {    c := make(chan int)    quit := make(chan int)    go func() {        for i := 0; i < 10; i++ {            fmt.Println(<-c)        }        quit <- 0    }()    fibonacci(c, quit)}
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

x 总是有一个值。所以不应该选择总是落在 case 'c <- x' 上吗?

不,因为这个通道是无缓冲的,发送将阻塞,直到有人可以从它接收。

阅读关于Effective Go 的频道:

接收器总是阻塞直到有数据要接收。如果通道未缓冲,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方只会阻塞,直到值被复制到缓冲区;如果缓冲区已满,这意味着等待某个接收器检索到一个值。

此外,如果 select 语句中的 2 个 case 可以继续,则伪随机选择一个。

如果可以进行一个或多个通信,则通过统一伪随机选择选择可以进行的单个通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,“select”语句会阻塞,直到至少有一个通信可以继续。


查看完整回答
反对 回复 2021-10-11
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信