4

当我尝试打印时:

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

谢谢

4

1 回答 1

8

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

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

所以不,c <- x如果发送操作成功,则不会评估为真。相反,case 块的语句x, y = y, x + y 被简单地执行。没有发送结果,没有真实值,存储在任何地方。

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

Oblig:选择语句上的语言规范。它真的非常可读。

于 2012-04-14T03:02:40.510 回答