0Pricing
Go Academy · 课时

select 语句

使用 select 多路复用通道

select 语句 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

什么是多路选择

select 语句允许协程同时等待多个通道操作。它会选择第一个可以继续执行的分支,类似于 switch,但专门用于通道。

基本语法

select 中的每个 case 都是通道发送或接收操作:

select {
case msg := <-ch1:
    fmt.Println("ch1:", msg)
case msg := <-ch2:
    fmt.Println("ch2:", msg)
}

使用 default 实现非阻塞

添加 default 分支后,select 就会变为非阻塞操作——如果没有通道准备就绪,它会立即进入 default 分支。

select {
case v := <-ch:
    fmt.Println(v)
default:
    fmt.Println("no value ready")
}

随机选择

当多个分支同时准备就绪时,Go 会随机选择其中一个——每个就绪分支被选中的机会相等。这样可以避免饥饿。

在 select 中发送

分支也可以执行通道发送操作。当通道有缓冲空间(或有接收方正在等待)时,发送分支就绪。

select {
case ch1 <- val1:
    fmt.Println("sent to ch1")
case ch2 <- val2:
    fmt.Println("sent to ch2")
}

空 select 会永久阻塞

不包含任何分支的 select{} 会让当前协程永久阻塞。这是一种常见写法,用于在其他协程运行期间保持主协程存活。

func main() {
    go serve()
    select {} // block forever
}

使用 select 循环

将 select 放入 for 循环中,可以持续复用多个通道。添加 done 通道即可干净地退出循环。

for {
    select {
    case v := <-data:
        process(v)
    case <-done:
        return
    }
}

nil 通道

nil 通道在 select 分支中会永久阻塞,从而实际上禁用该分支。您可以利用这一点,在运行时动态启用或禁用分支。

var ch chan int // nil
select {
case v := <-ch: // never selected
    _ = v
case v := <-other:
    fmt.Println(v)
}

使用已关闭的通道进行 select

从已关闭的通道接收时,操作总会立即成功,并返回零值。请使用双值形式来检测通道是否已关闭。

select {
case v, ok := <-ch:
    if !ok { return } // channel closed
    use(v)
}

优先级模式

Go 的 select 原生不支持优先级。若要优先处理某个通道,可以嵌套 select,或者使用一个循环,通过 default 先检查高优先级通道。

for {
    select {
    case v := <-highPriority:
        handle(v)
    default:
        select {
        case v := <-lowPriority:
            handle(v)
        }
    }
}

阶段性回顾

select 会等待多个通道,选择一个随机的就绪分支;使用 default 可以实现非阻塞,nil 通道则会禁用对应分支。常见模式是:for + select + done。

快速检查

当 select 中的多个分支同时准备就绪时,会发生什么?

回顾:select 语句

要点:

  • select 会一直阻塞,直到某个通道分支准备就绪
  • 多个分支就绪 → 随机选择
  • default 会使操作变为非阻塞
  • nil 通道会禁用对应分支
  • for + select + done 是标准的多路复用循环

常见问题解答

「select 语句」课时是免费的吗?

是的 — 「select 语句」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「select 语句」这节课中我会学到什么?

使用 select 多路复用通道 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「select 语句」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. select 语句
  2. 超时与计时器
  3. 扇入与扇出模式
  4. 工作池模式
← 返回 Go Academy