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

发布于 1周前 作者 phonegap100 来自 Go语言

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

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

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

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


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

更多关于请教一个 Golang Go语言中的 select 语法问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

同疑问,mark

更多关于请教一个 Golang Go语言中的 select 语法问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


select {<br> case e, ok := &lt;-ch1:<br> ...<br> case e, ok := &lt;-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

你好!很高兴帮助你解答关于 Golang 中 select 语法的问题。

select 语句是 Go 语言中用于处理多个通道(channel)发送和接收操作的一种机制。它类似于 switch 语句,但 select 会阻塞,直到其中一个通道可以进行通信。

以下是 select 语句的基本结构:

select {
case <-chan1:
    // 当从 chan1 成功接收到数据时执行的代码
case chan2 <- 1:
    // 当成功向 chan2 发送数据时执行的代码
default:
    // 如果没有通道准备好,则执行这里的代码(可选)
}

在使用 select 时,需要注意以下几点:

  1. 多个 caseselect 可以包含多个 case 分支,每个分支对应一个通道的发送或接收操作。
  2. 随机选择:如果有多个通道同时准备好,select 会随机选择一个执行。
  3. default 分支default 分支是可选的,当没有通道准备好时,会执行 default 分支的代码。
  4. 通道关闭:当关闭一个通道时,任何向该通道发送数据的操作都会导致 panic,而从该通道接收数据的操作会立即成功并返回通道类型的零值。

希望这些信息能帮助你更好地理解 Go 语言中的 select 语法。如果你有更具体的问题或示例代码需要解析,请随时提供,我会尽力帮助你!

回到顶部