猿问

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

我正在关注 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)

}


MMTTMM
浏览 207回答 3
3回答

白猪掌柜的

x 总是有一个值。所以不应该选择总是落在 case 'c <- x' 上吗?不,因为这个通道是无缓冲的,发送将阻塞,直到有人可以从它接收。阅读关于Effective Go 的频道:接收器总是阻塞直到有数据要接收。如果通道未缓冲,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方只会阻塞,直到值被复制到缓冲区;如果缓冲区已满,这意味着等待某个接收器检索到一个值。此外,如果 select 语句中的 2 个 case 可以继续,则伪随机选择一个。如果可以进行一个或多个通信,则通过统一伪随机选择选择可以进行的单个通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,“select”语句会阻塞,直到至少有一个通信可以继续。
随时随地看视频慕课网APP

相关分类

Go
我要回答