it编程 > 前端脚本 > Golang

Go 语言中的select语句详解及工作原理

2人参与 2025-04-24 Golang

go 语言中的 select 是做什么的

在 go 语言中,select 语句是用于处理多个通道(channel)操作的一种控制结构。它类似于 switch 语句,但专门用于并发编程,允许 goroutine 在多个通道上等待操作(发送或接收),并在某个通道就绪时执行对应的分支。select 是 go 并发模型中的核心特性之一,与通道和 goroutine 紧密相关。

基本功能

select 的主要作用是:

语法

select {
case <-channel1:
    // 从 channel1 接收数据时的处理逻辑
case channel2 <- value:
    // 向 channel2 发送数据时的处理逻辑
case v := <-channel3:
    // 从 channel3 接收数据并赋值给 v 的处理逻辑
default:
    // 所有通道都未就绪时的默认逻辑(可选)
}

工作原理

等待通道就绪

非阻塞行为

空 select

示例

示例 1:监听多个通道

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)
    }
}

示例 2:带默认分支

package main
import (
    "fmt"
)
func main() {
    ch := make(chan string)
    select {
    case msg := <-ch:
        fmt.println("received:", msg)
    default:
        fmt.println("no message received")
    }
}

示例 3:发送和接收结合

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")
    }
}

示例 4:超时控制

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")
    }
}

常见用途

多路复用

在多个通道之间选择就绪的通道,避免逐一轮询。

超时处理

使用 time.after 实现操作超时。

非阻塞检查

通过 default 分支检查通道是否就绪。

协调 goroutine

在并发任务中,根据通道状态决定下一步操作。

注意事项

随机选择

当多个 case 同时就绪时,select 随机选择一个执行,而不是按顺序。

阻塞性

没有 default 时,select 会阻塞直到某个通道就绪。

空 select

select {}

这会永久阻塞,通常用于主 goroutine 等待。

通道关闭

如果某个通道已关闭,接收操作会立即返回零值,可能需要额外的逻辑判断。

总结

到此这篇关于go 语言中的select是做什么的的文章就介绍到这了,更多相关go select内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

go语言内存泄漏的常见形式

04-24

go语言中空结构体的实现

04-24

go语言中线程池的实现

04-24

go协程池实现原理小结

04-24

Go语言中字符串四种拼接方式的性能对比

04-24

go语言使用range来接收通道里面的数据

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论