- 介绍
- 标记
- 源码表示法
- 词汇元素
- 常量
- 变量
- 类型
- 方法集
- 布尔类型
- 数字类型
- 字符串类型
- 数组类型
- 切片类型
- 结构体类型
- 指针类型
- 函数类型
- 接口类型
- Map 类型
- Channel 类型
- 类型的属性和值
- 代码块
- 声明和作用域
- 标签的作用域
- Iota
- 类型声明
- 变量声明
- 短变量声明
- 函数声明
- 方法声明
- 表达式
- 语句
- switch 语句
- for 语句
- Go 语句
- select 语句
- return 语句
- break 语句
- continue 语句
- goto 语句
- Fallthrough 语句
- Defer 语句
- 内置函数
- Close
- 长度和容积
- 内存分配
- 创建切片、map 和 管道
- 追加或者拷贝切片
- 删除 map 中的元素
- 操作复数
- 处理 panic
- 初始化
- 程序的初始化和执行
- 系统相关
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
select 语句
select 语句会在接收/发送操作集中选择一个执行。它看起来和 switch 很像,只不过是专门针对通信操作的。
SelectStmt = "select" "{" { CommClause } "}" .
CommClause = CommCase ":" StatementList .
CommCase = "case" ( SendStmt | RecvStmt ) | "default" .
RecvStmt = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .
RecvExpr = Expression .
接收表达式可以将接收表达式的值分配给一个或两个变量。接收表达式必须是一个接收运算元(可以使用括号括起来)。它最多允许有一个 default 语句。
select 语句执行以下几个步骤:
-
对于 select 语句的所有分句,接收操作的通道运算元、通道、发送语句的右侧表达式都会执行一次操作。
-
如果一个或多个通信同时发生,它会通过一致性随机选择一个执行。如果没有 default 语句,select 语句会一直阻塞。
-
除了 default 分句,其他分句只有在开始进行通信的时候才会执行。
-
如果 select 分句是一个接收语句,它可以给变量分配值。
-
执行 select 分句内的内容。
如果向 nil 通道发送信息在没有 default 分句的情况下会一直阻塞。
var a []int
var c, c1, c2, c3, c4 chan int
var i1, i2 int
select {
case i1 = <-c1:
print("received ", i1, " from c1\n")
case c2 <- i2:
print("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
print("received ", i3, " from c3\n")
} else {
print("c3 is closed\n")
}
case a[f()] = <-c4:
// same as:
// case t := <-c4
// a[f()] = t
default:
print("no communication\n")
}
for { // send random sequence of bits to c
select {
case c <- 0: // note: no statement, no fallthrough, no folding of cases
case c <- 1:
}
}
select {} // block forever
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论