请教一个 Go 语言的 select 语法问题

2018-07-19 09:32:09 +08:00
 bwangel

在看 Go 语言 select 语法文档的时候文档地址,发现了这样的一条定义。

RecvStmt   = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .

这条定义我的理解是RecvStmt可以通过 表达式列表 = RecvExpr 的形式来定义。

对于这里,我感到比较困惑,表达式不应该是用来求值的吗,应该不可以用来赋值。哪位老哥能帮忙解释一下啊,最好能举一个相关的例子,谢谢了。

1980 次点击
所在节点    Go 编程语言
11 条回复
chai2010
2018-07-19 09:43:36 +08:00
同疑问,mark
torbrowserbridge
2018-07-19 09:48:36 +08:00
```select {
case e, ok := <-ch1:
...
case e, ok := <-ch2:
...
default:
}```
bwangel
2018-07-19 09:51:08 +08:00
@torbrowserbridge

这个应该是后面一种定义 标识符列表 := RecvStmt
per
2018-07-19 09:53:29 +08:00
@bwangel 用表达式不是因为前面预先声明了然后直接赋值吗?
neoblackcap
2018-07-19 09:53:29 +08:00
var a []int
var c, c1, c2, c3, c4 chan int
var i1, i2 int
select {
case a[f()] = <-c4:
// same as:
// case t := <-c4
// a[f()] = t
default:
print("no communication\n")
}
torbrowserbridge
2018-07-19 09:55:23 +08:00
e, ok := <-ch1: 这就是一个 RecvStmt 啊
heimeil
2018-07-19 10:05:37 +08:00
https://golang.org/ref/spec#Expressions
Expressions 包括很多操作,比如 Index expressions, Address operators
kangkang
2018-07-19 10:39:14 +08:00
表达式也可以是一条定义+一个判断
reus
2018-07-19 10:43:19 +08:00
表达式不能赋值,但可以给表达式求值的结果赋值
例如
a[0]
b.Foo
*p
等等
bwangel
2018-07-19 10:56:22 +08:00
@heimeil @neoblackcap @torbrowserbridge

感觉你们的回复,我感觉有点懂了,V2ex 的回复不能使用 markdown 太坑爹了,我写在 gist 上了。

https://gist.github.com/bwangelme/ac6783f85687665ede3d46c605eb9bba
torbrowserbridge
2018-07-19 10:58:42 +08:00
赞 LS

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/472217

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX