请教一个 Golang Go语言中的 select 语法问题
在看 Go 语言 select 语法文档的时候文档地址,发现了这样的一条定义。
RecvStmt = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .
这条定义我的理解是RecvStmt
可以通过 表达式列表 = RecvExpr
的形式来定义。
对于这里,我感到比较困惑,表达式不应该是用来求值的吗,应该不可以用来赋值。哪位老哥能帮忙解释一下啊,最好能举一个相关的例子,谢谢了。
请教一个 Golang Go语言中的 select 语法问题
更多关于请教一个 Golang Go语言中的 select 语法问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
select {<br> case e, ok := <-ch1:<br> ...<br> case e, ok := <-ch2:<br> ...<br> default: <br>}
这个应该是后面一种定义 标识符列表 := RecvStmt
用表达式不是因为前面预先声明了然后直接赋值吗?
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”)
}
e, ok := <-ch1: 这就是一个 RecvStmt 啊
https://golang.org/ref/spec#Expressions
Expressions 包括很多操作,比如 Index expressions, Address operators
表达式也可以是一条定义+一个判断
表达式不能赋值,但可以给表达式求值的结果赋值
例如
a[0]
b.Foo
*p
等等
感觉你们的回复,我感觉有点懂了,V2ex 的回复不能使用 markdown 太坑爹了,我写在 gist 上了。
https://gist.github.com/bwangelme/ac6783f85687665ede3d46c605eb9bba
赞 LS
你好!很高兴帮助你解答关于 Golang 中 select
语法的问题。
select
语句是 Go 语言中用于处理多个通道(channel)发送和接收操作的一种机制。它类似于 switch
语句,但 select
会阻塞,直到其中一个通道可以进行通信。
以下是 select
语句的基本结构:
select {
case <-chan1:
// 当从 chan1 成功接收到数据时执行的代码
case chan2 <- 1:
// 当成功向 chan2 发送数据时执行的代码
default:
// 如果没有通道准备好,则执行这里的代码(可选)
}
在使用 select
时,需要注意以下几点:
- 多个
case
:select
可以包含多个case
分支,每个分支对应一个通道的发送或接收操作。 - 随机选择:如果有多个通道同时准备好,
select
会随机选择一个执行。 default
分支:default
分支是可选的,当没有通道准备好时,会执行default
分支的代码。- 通道关闭:当关闭一个通道时,任何向该通道发送数据的操作都会导致 panic,而从该通道接收数据的操作会立即成功并返回通道类型的零值。
希望这些信息能帮助你更好地理解 Go 语言中的 select
语法。如果你有更具体的问题或示例代码需要解析,请随时提供,我会尽力帮助你!