Go 语言 select 语句
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); }
- 每个 case 都必须是一个 channel
- 所有 channel 表达式都会被求值
- 所有被发送的表达式都会被求值
- 如果任意某个 channel 可以进行,它就执行;其他被忽略
-
如果多个 case 都可以运行,select 语句会随机公平地选出一个执行,其他不会执行
否则:
- 如果有 default 子句,则执行该语句
- 如果没有 default 子句,select 将阻塞,直到某个 channel 可以运行;
-
select 不会重新对 channel 或值进行求值
实例
/** * file: main.go * author: 简单教程(www.twle.cn) * Copyright © 2015-2065 www.twle.cn. 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