Go 语言 select 语句

select 是 Go 中的一个控制结构,类似于 switch 语句。

select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收。

select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。

如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。

以下描述了 select 语句的语法:

go 复制代码
select {
  case <- channel1:
    // 执行的代码
  case value := <- channel2:
    // 执行的代码
  case channel3 <- value:
    // 执行的代码

  // 你可以定义任意数量的 case

  default:
    // 所有通道都没有准备好,执行的代码
}

以下是 select 语句的一些特点:

  • 每个 case 都必须是一个通道操作
  • 所有 channel 表达式都会被求值
  • 所有被发送的表达式都会被求值
  • 如果任意某个通道可以进行,它就执行,其他被忽略
  • 如果有多个 case 都可以运行,select 会随机公平地选出一个执行,其他不会执行
  • 否则:
    • 如果有 default 子句,则执行该语句
    • 如果没有 default 子句,select 将阻塞,直到某个通道可以运行;Go 不会重新对 channel 或值进行求值

以下是一个使用 select 语句的示例:

go 复制代码
package main

import "fmt"

func main() {
  // 定义两个通道
  ch1 := make(chan string)
  ch2 := make(chan string)

  // 启动两个 goroutine,分别从两个通道中获取数据
  go func() {
    for {
      ch1 <- "from 1"
    }
  }()
  go func() {
    for {
      ch2 <- "from 2"
    }
  }()

  // 使用 select 语句非阻塞地从两个通道中获取数据
  for {
    select {
    case msg1 := <-ch1:
      fmt.Println(msg1)
    case msg2 := <-ch2:
      fmt.Println(msg2)
    default:
      // 如果两个通道都没有可用的数据,则执行这里的语句
      fmt.Println("no message received")
    }
  }
}

在这个示例中,我们定义了两个通道,并启动了两个协程(Goroutine)从这两个通道中获取数据。在 main 函数中,我们使用 select 语句在这两个通道中进行非阻塞的选择,如果两个通道都没有可用的数据,就执行 default 子句中的语句。

通过使用 select 语句,我们可以方便地实现非阻塞的通道操作,提高程序的并发性能和响应能力。

以上是关于 select 语句的介绍和示例。

相关推荐
上进小菜猪11 分钟前
面向课堂与自习场景的智能坐姿识别系统——从行为感知到可视化部署的完整工程【YOLOv8】
后端
BestAns1 小时前
一文带你吃透 Java 反射机制
java·后端
沐知全栈开发1 小时前
HTML5 浏览器支持
开发语言
wasp5201 小时前
AgentScope Java 核心架构深度解析
java·开发语言·人工智能·架构·agentscope
WHOVENLY1 小时前
【javaScript】- 笔试题合集(长期更新,建议收藏,目前已更新至31题)
开发语言·前端·javascript
2501_916766541 小时前
【Springboot】数据层开发-数据源自动管理
java·spring boot·后端
小高Baby@1 小时前
Go语言中判断map 中是否包含某个key 的方法
golang
慌糖2 小时前
流-为序列化解释
开发语言
半夏知半秋2 小时前
docker常用指令整理
运维·笔记·后端·学习·docker·容器
程序员码歌2 小时前
短思考第263天,每天复盘10分钟,胜过盲目努力一整年
android·前端·后端