Go语言select语句的用法(附带实例)
Go 语言中,select 的语法格式与 switch 的语法格式几乎相同,都是由一系列的 case 语句和一个可选的 default 语句组成。但是,select 只适用于通道。
select 的语法格式如下:
当两个协程同时访问两个相同的通道时,在两个协程中必须以相同顺序访问这两个通道。下例演示这种方式的实现过程。
【实例】两个协程同时访问两个相同的通道。
创建两个通道 ch1 和 ch2。为匿名函数创建协程;在匿名函数中,定义一个值为 1 的 int 型变量 v,使用通道 ch1 发送变量 v。变量 v2 接收通道 ch2 传输的数据,打印变量 v 和变量 v2 的值。
在 main() 函数中,定义一个值为 2 的 int 型变量 v,并声明一个 int 型变量 v2,使用 select 语句检查任意 case 语句是否被执行,第一个 case 语句使用通道 ch2 发送变量 v,另一个 case 语句是变量 v2 接收通道 ch1 传输的数据,打印变量 v 和变量 v2 的值。代码如下:
select 的语法格式如下:
select {
case ch1:
... //实现当前case语句功能的代码
case ch2:
... //实现当前case语句功能的代码
... //任意数量的case语句
default: //可选
... //实现default语句功能的代码
}
每个 case 语句都指定一次通信。指定一次通信是指使用一个通道发送或接收数据。当触发一个 case 语句时,将执行这个 case 语句;如果触发多个 case 语句,则随机执行一个 case 语句。当两个协程同时访问两个相同的通道时,在两个协程中必须以相同顺序访问这两个通道。下例演示这种方式的实现过程。
【实例】两个协程同时访问两个相同的通道。
创建两个通道 ch1 和 ch2。为匿名函数创建协程;在匿名函数中,定义一个值为 1 的 int 型变量 v,使用通道 ch1 发送变量 v。变量 v2 接收通道 ch2 传输的数据,打印变量 v 和变量 v2 的值。
在 main() 函数中,定义一个值为 2 的 int 型变量 v,并声明一个 int 型变量 v2,使用 select 语句检查任意 case 语句是否被执行,第一个 case 语句使用通道 ch2 发送变量 v,另一个 case 语句是变量 v2 接收通道 ch1 传输的数据,打印变量 v 和变量 v2 的值。代码如下:
package main
import "fmt"
func main() {
ch1 := make(chan int) // 创建通道ch1
ch2 := make(chan int) // 创建通道ch2
// 为匿名函数创建协程
go func() {
v := 1 // 定义值为1的int型变量v
ch1 <- v // 使用通道ch1发送变量v
v2 := <- ch2 // 变量v2接收通道ch2传输的数据
fmt.Println(v, v2) // 打印变量v和变量v2的值
}()
v := 2 // 定义值为2的int型变量v
var v2 int // 声明int型变量v2
select {
case ch2 <- v: // 使用通道ch2发送变量v
case v2 = <- ch1: // 变量v2接收通道ch1传输的数据
fmt.Println(v, v2) // 打印变量v和变量v2的值
}
}
运行结果如下:
2 1
ICP备案:
公安联网备案: