select语句 #
格式:
select{
case <-ch1:
...
case data := <-ch2:
...
case ch3<-data:
...
default:
默认操作,default语句可选
}
备注:
1. 每个 case 都必须是一个 channel
2. 所有 channel 表达式都会被求值
3. 所有被发送的表达式都会被求值
4. 如果任意某个 channel 可以进行,它就执行;其他被忽略
5. 如果多个 case 都可以运行,select 语句会随机公平地选出一个执行,其他不会执行
否则:如果有 default 子句,则执行该语句
如果没有 default 子句,select 将阻塞,直到某个 channel 可以运行
6. select 不会重新对 channel 或值进行求值
7. 如果没有 case/default 可运行,它将阻塞,直到有 case/default 可运行
select示例 #
示例1:
package main
import (
"fmt"
)
func main() {
//var c1, c2, c3 chan int
c1 := make(chan int, 1)
c2 := make(chan int, 1)
c3 := make(chan int, 1)
var i1, i2 int
i2 = 100
select {
case i1 = <-c1:
fmt.Printf("接收信道c1发来的内容:%v %s ", i1, " \n")
case c2 <- i2:
fmt.Printf("向信道c2发送内容:%v %s ", i2, " \n")
case i3, ok := (<-c3): //或者: i3, ok := <-c3
if ok {
fmt.Printf("接收到信道c3发来的内容:%v %s ", i3, " \n")
} else {
fmt.Printf("c3信道关闭了\n")
}
default:
fmt.Printf("没有内容可处理\n")
}
}
输出:向信道c2发送内容:100
示例2:
ch := make(chan int, 1)
for i := 1; i <= 10; i++ {
select {
case x := <-ch: //从信道ch中读内容
fmt.Println(x)
case ch <- i: //向信道ch写内容
}
}
输出:
1
3
5
7
9
说明:循环单数是写,循环偶数是读,即整个循环交替读写信道