golang中的select是如何工作的?

5kgi1eie  于 2023-06-19  发布在  Go
关注(0)|答案(1)|浏览(124)

我执行了上面的代码,其中有选择:

func fibonacci(c, quit chan int) {
    x, y := 0, 1
    for {
        select {
        case c <- x:
            fmt.Printf("x = %d, y = %d \n", x, y)
            x, y = y, x+y
        case <-quit:
            //fmt.Println(<-c)
            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)
}

我的问题是为什么选择在第10次迭代时停止?c <- x运算不是总是可能的,而且应该计算斐波那契数到无穷大吗?

koaltpgm

koaltpgm1#

通道c未缓冲,因此c <- x只能在存在并发<- c时继续。
此外,如果c使用足够大的缓冲区进行缓冲,则select不会总是选择它,因为select是随机选择的。

相关问题