我正在研究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)
}
对于第二个案例陈述,我知道当某些内容通过退出频道时会被触发。 但我不明白为什么第一个案例陈述也会被触发。它只是明显地推入管道。它看起来不像是一些“等待和触发”的场景。 更广泛地说,判断案例陈述是否被触发的标准是什么?
答案 0 :(得分:0)
在这种情况下,看起来就像一些“等待和触发”场景。只有当管道的接收方可以接收时,才能发送无缓冲的信道。无缓冲的通道就像会合。因此c <- x
无法在fmt.Println(<-c)
完成打印并准备接收新值之前继续进行。
在许多可能的选择的情况下,通过统一的伪随机选择来选择案例。所以判断的标准只是一个概率。如果许多网站想要从一个频道发送或接收,那么它可能会被触发而不是罕见的情况。