当我尝试打印出来时:
fmt.Println(c <- x)在下面的代码块中的for循环之前,看看“c&lt; - x”会评估什么,它得到了错误消息:< p>
./ select.go:7:send statement c&lt; - x用作值;使用select进行非阻塞发送
如果发送操作成功,“c&lt; - x”是否被评估为真?为什么Go只允许你在select语句中的case语句中使用send语句的值(也就是“c&lt; - x”的值)?
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select {
case c <- x:
x, y = y, x + y
case <-quit:
fmt.Println("quit")
return
}
}
}
谢谢
答案 0 :(得分:8)
这是真的,c <- x
是一个陈述,没有任何价值。
您可能会将select
与switch
混淆。 Switch通过查看哪个case表达式匹配或计算为true来工作。另一方面,选择查找未阻塞的案例,选择其中一个以允许继续,然后运行案例块中的语句。
所以不,c <- x
在发送操作成功时未被评估为真。相反,案例块的陈述x, y = y, x + y
简单地执行。在任何地方都没有发送,没有真正价值的结果。
您可能已经读过,对于 receive 操作,分配有短语的变量仅在case块的范围内。这是正确的(虽然在上面的select语句的情况下没有简短的声明。)如果你在case块结束后有一个你想要一个接收值的情况,你将使用一个简单的赋值而不是一个简短的声明。 / p>
Oblig:the language spec on the select statement。它真的非常易读。