goroutine channels - send语句的值

时间:2012-04-14 00:57:42

标签: go channel goroutine

当我尝试打印出来时:

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
            }
        }
    }

谢谢

1 个答案:

答案 0 :(得分:8)

这是真的,c <- x是一个陈述,没有任何价值。

您可能会将selectswitch混淆。 Switch通过查看哪个case表达式匹配或计算为true来工作。另一方面,选择查找未阻塞的案例,选择其中一个以允许继续,然后运行案例块中的语句。

所以不,c <- x在发送操作成功时未被评估为真。相反,案例块的陈述x, y = y, x + y 简单地执行。在任何地方都没有发送,没有真正价值的结果。

您可能已经读过,对于 receive 操作,分配有短语的变量仅在case块的范围内。这是正确的(虽然在上面的select语句的情况下没有简短的声明。)如果你在case块结束后有一个你想要一个接收值的情况,你将使用一个简单的赋值而不是一个简短的声明。 / p>

Oblig:the language spec on the select statement。它真的非常易读。