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

Go 频道的菜鸟

Go 频道的菜鸟

Go
青春有我 2021-07-30 17:43:59
我试图围绕 Go 中的并发模式进行思考,但对#69 中的这个示例感到困惑package mainimport "fmt"func fibonacci(c, quit chan int) {    x, y := 0, 1    for {        select {        case c <- x:            x, y = y, x+y        case <-quit:            fmt.Println("quit")            return        }    }}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)}特别是,我不明白如何for i := 0; i < 10; i++ {    fmt.Println(<-c) }应该可以工作,因为我们所做的只是制作频道,现在我们从中“接收”了 10 次?我尝试了其他代码,我在其中创建了一个频道,然后尝试立即从中接收,但我总是收到错误消息,但这似乎有效,我不太清楚。谢谢你的帮助!
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

fmt.Println(<-c)将阻塞,直到有东西要从通道读取。由于我们for在一个单独的 goroutine 中启动循环,这意味着循环的第一次迭代将简单地等待,直到有东西可以读取。

然后该fibonacci函数启动,并将数据向下推入通道。这将使循环唤醒并开始打印。

我希望它现在更有意义。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

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