首页 > 编程笔记 > Go语言笔记 阅读:2

Go语言select语句的用法(附带实例)

Go 语言中,select 的语法格式与 switch 的语法格式几乎相同,都是由一系列的 case 语句和一个可选的 default 语句组成。但是,select 只适用于通道。

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

相关文章