Golang选择触发器

时间:2015-04-10 14:53:33

标签: go

我正在研究GoLang教程 Select.go

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)
}

对于第二个案例陈述,我知道当某些内容通过退出频道时会被触发。 但我不明白为什么第一个案例陈述也会被触发。它只是明显地推入管道。它看起来不像是一些“等待和触发”的场景。 更广泛地说,判断案例陈述是否被触发的标准是什么?

1 个答案:

答案 0 :(得分:0)

在这种情况下,看起来就像一些“等待和触发”场景。只有当管道的接收方可以接收时,才能发送无缓冲的信道。无缓冲的通道就像会合。因此c <- x无法在fmt.Println(<-c)完成打印并准备接收新值之前继续进行。 在许多可能的选择的情况下,通过统一的伪随机选择来选择案例。所以判断的标准只是一个概率。如果许多网站想要从一个频道发送或接收,那么它可能会被触发而不是罕见的情况。