select语句

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
说明:循环单数是写,循环偶数是读,即整个循环交替读写信道
Build by Loppo 0.6.15