108人参与 • 2025-04-24 • Golang
在 go 语言中,select 语句是用于处理多个通道(channel)操作的一种控制结构。它类似于 switch 语句,但专门用于并发编程,允许 goroutine 在多个通道上等待操作(发送或接收),并在某个通道就绪时执行对应的分支。select 是 go 并发模型中的核心特性之一,与通道和 goroutine 紧密相关。
select 的主要作用是:
select {
case <-channel1:
// 从 channel1 接收数据时的处理逻辑
case channel2 <- value:
// 向 channel2 发送数据时的处理逻辑
case v := <-channel3:
// 从 channel3 接收数据并赋值给 v 的处理逻辑
default:
// 所有通道都未就绪时的默认逻辑(可选)
}case 表示一个通道操作(发送或接收)。default 是可选的,表示当所有通道都未就绪时执行的逻辑。等待通道就绪:
select 会阻塞当前 goroutine,直到某个 case 中的通道操作可以执行。select 会随机选择一个 case 执行(避免饥饿问题)。非阻塞行为:
default 分支,且没有通道就绪,select 会立即执行 default 而不会阻塞。空 select:
select 中没有 case,会永久阻塞(类似于 for {})。package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.sleep(1 * time.second)
ch1 <- "from ch1"
}()
go func() {
time.sleep(2 * time.second)
ch2 <- "from ch2"
}()
select {
case msg1 := <-ch1:
fmt.println("received:", msg1)
case msg2 := <-ch2:
fmt.println("received:", msg2)
}
}received: from ch1ch1 在 1 秒后就绪,比 ch2(2 秒)快,因此执行 ch1 的分支。package main
import (
"fmt"
)
func main() {
ch := make(chan string)
select {
case msg := <-ch:
fmt.println("received:", msg)
default:
fmt.println("no message received")
}
}no message receivedch 没有数据就绪,select 执行 default 分支。package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string, 1)
ch2 := make(chan string, 1)
select {
case ch1 <- "to ch1":
fmt.println("sent to ch1")
case msg := <-ch2:
fmt.println("received from ch2:", msg)
default:
fmt.println("nothing happened")
}
}sent to ch1ch1 是缓冲通道,可以立即发送成功,因此执行发送分支。package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
select {
case msg := <-ch:
fmt.println("received:", msg)
case <-time.after(2 * time.second):
fmt.println("timeout after 2 seconds")
}
}timeout after 2 secondstime.after 创建一个定时器通道,2 秒后就绪,模拟超时逻辑。多路复用:
在多个通道之间选择就绪的通道,避免逐一轮询。
超时处理:
使用 time.after 实现操作超时。
非阻塞检查:
通过 default 分支检查通道是否就绪。
协调 goroutine:
在并发任务中,根据通道状态决定下一步操作。
随机选择:
当多个 case 同时就绪时,select 随机选择一个执行,而不是按顺序。
阻塞性:
没有 default 时,select 会阻塞直到某个通道就绪。
空 select:
select {}这会永久阻塞,通常用于主 goroutine 等待。
通道关闭:
如果某个通道已关闭,接收操作会立即返回零值,可能需要额外的逻辑判断。
select 是 go 中用于处理多通道操作的并发控制语句。到此这篇关于go 语言中的select是做什么的的文章就介绍到这了,更多相关go select内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论