我正在关注 tour.golang.org 上的示例。我主要理解这个例子,我唯一的问题是为什么当我们通过 0 退出频道时它会停止?不管是否传递了 0 来退出,x 总是有一个值。所以不应该选择总是落在 case '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)}
3 回答
白猪掌柜的
TA贡献1893条经验 获得超10个赞
x 总是有一个值。所以不应该选择总是落在 case 'c <- x' 上吗?
不,因为这个通道是无缓冲的,发送将阻塞,直到有人可以从它接收。
阅读关于Effective Go 的频道:
接收器总是阻塞直到有数据要接收。如果通道未缓冲,则发送方将阻塞,直到接收方收到该值。如果通道有缓冲区,则发送方只会阻塞,直到值被复制到缓冲区;如果缓冲区已满,这意味着等待某个接收器检索到一个值。
此外,如果 select 语句中的 2 个 case 可以继续,则伪随机选择一个。
如果可以进行一个或多个通信,则通过统一伪随机选择选择可以进行的单个通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,“select”语句会阻塞,直到至少有一个通信可以继续。
- 3 回答
- 0 关注
- 205 浏览
添加回答
举报
0/150
提交
取消