Go中的Fibonacci使用频道

时间:2015-06-05 11:50:20

标签: go fibonacci

我正在关注tour.golang.org上的示例。

我主要理解这个例子,我唯一的问题是为什么当我们将0传递给退出频道时它会停止?无论是否将0传递给退出,x总是有一个值。所以不应该选择总是落在案例'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)
}

1 个答案:

答案 0 :(得分:2)

  

x总是有一个值。因此,不应该选择总是落在案例上&#39; c&lt; - x&#39; ?

不,因为此频道是无缓冲的,发送将阻止,直到有人可以从中接收。

了解Effective Go上的频道:

  

接收器始终阻塞,直到有数据要接收为止。 如果通道是无缓冲的,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方仅阻止该值复制到缓冲区;如果缓冲区已满,则表示等待某个接收方检索到一个值。

此外,如果select语句中有2个案例可以继续,one is picked pseudo-randomly

  

如果一个或多个通信可以继续,则可以通过统一的伪随机选择来选择可以继续的单个通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,&#34;选择&#34;语句阻塞,直到至少有一个通信可以继续。