我正在学习GoLang教程选择.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)
}
对于第二种情况,我知道当有东西通过退出通道时,它会被触发。但我不明白为什么第一个案例陈述也会被触发。它只是在往管道里挤。它看起来不像是某种"等待并触发"的场景。更广泛地说,判断案件陈述是否被触发的标准是什么?
在这种情况下,看起来像一些"等待并触发"的场景。只有当管道的接收器侧可以接收时,才能在无缓冲通道中发送。无缓冲通道就像集合。因此,在fmt.Println(<-c)
完成打印并准备接收新值之前,c <- x
无法继续。在许多可能的选择的情况下,通过统一的伪随机选择来选择情况。因此,评判标准只是一种可能性。如果许多goroutings想要从一个通道发送或接收,那么它可能会被触发,而不是罕见的情况。