Go 频道的菜鸟

我试图围绕 Go 中的并发模式进行思考,但对#69 中的这个示例感到困惑


package main


import "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 次?我尝试了其他代码,我在其中创建了一个频道,然后尝试立即从中接收,但我总是收到错误消息,但这似乎有效,我不太清楚。谢谢你的帮助!


青春有我
浏览 226回答 2
2回答

叮当猫咪

fmt.Println(<-c)将阻塞,直到有东西要从通道读取。由于我们for在一个单独的 goroutine 中启动循环,这意味着循环的第一次迭代将简单地等待,直到有东西可以读取。然后该fibonacci函数启动,并将数据向下推入通道。这将使循环唤醒并开始打印。我希望它现在更有意义。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go