pla*_*pus 4 channel go goroutine
当我试图打印出来时:
fmt.Println(c <- x)在下面的代码块中的for循环之前,看看"c < - x"将评估什么,它得到了错误消息:
./select.go:7:发送语句c < - x用作值; 使用select进行非阻塞发送
如果发送操作成功,"c < - x"是否被评估为真?为什么Go只允许你在select语句中的case语句中使用send语句的值(也就是"c < - 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
这是真的,c <- x是一种陈述,没有任何价值.
您可能会产生混淆select与switch.Switch通过查看哪个case表达式匹配或计算为true来工作.另一方面,选择查找未阻塞的情况,选择其中一个以允许继续,然后运行case块中的语句.
所以不,c <- x没有评估为真发送操作成功.相反,x, y = y, x + y
简单地执行case块的语句.在任何地方都没有发送,没有真正价值的结果.
您可能已经读过,对于接收操作,分配有短指令的变量仅在case块的范围内.这是正确的(虽然在上面的select语句的情况下没有简短的声明.)如果你在case块结束后有一个你想要一个接收值的情况,你将使用一个简单的赋值而不是一个简短的声明.
Oblig:select语句中的语言规范.它真的非常易读.