Go语言相比于其它语言多了 select 语句这种判断结构
select 语句是 Go 语言的一个控制结构,类似于用于 channel 的 switch 语句
select 语句中的每个 case 语句必须是一个 channel 操作,要么是发送要么是接收
select 语句随机执行一个可运行的 case,如果没有 case 可运行,它将阻塞,直到有 case 可运行
default 语句应该总是可运行的
语法
Go语言 select 语句语法格式如下
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定义任意数量的 case */
default : /* 可选 */
statement(s);
}
1、 每个case都必须是一个channel;
2、 所有channel表达式都会被求值;
3、 所有被发送的表达式都会被求值;
4、 如果任意某个channel可以进行,它就执行;其他被忽略;
5、 如果多个case都可以运行,select语句会随机公平地选出一个执行,其他不会执行;
否则:
- 如果有 default 子句,则执行该语句
- 如果没有 default 子句,select 将阻塞,直到某个 channel 可以运行;
6、 select不会重新对channel或值进行求值;
实例
/**
* file: main.go
* author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
* Copyright © 2015-2065 ddkk.com. All rights reserved.
*/
package main
import "fmt"
func main() {
var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
fmt.Printf("received ", i3, " from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
default:
fmt.Printf("no communication\n")
}
}
编译运行以上 Go 语言范例,输出结果如下
$ go run main.go
no communication