我正在关注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)
}
答案 0 :(得分:2)
x总是有一个值。因此,不应该选择总是落在案例上&#39; c&lt; - x&#39; ?
不,因为此频道是无缓冲的,发送将阻止,直到有人可以从中接收。
了解Effective Go上的频道:
接收器始终阻塞,直到有数据要接收为止。 如果通道是无缓冲的,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方仅阻止该值复制到缓冲区;如果缓冲区已满,则表示等待某个接收方检索到一个值。
此外,如果select语句中有2个案例可以继续,one is picked pseudo-randomly。
如果一个或多个通信可以继续,则可以通过统一的伪随机选择来选择可以继续的单个通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,&#34;选择&#34;语句阻塞,直到至少有一个通信可以继续。