Z
ZHANK
编程在线教程Go 教程select 多路复用
并发编程

select 多路复用

select/case/default、超时控制 time.After、非阻塞发送

select 多路复用

select 同时等待多个 channel 操作——哪个先就绪就执行哪个。配合 time.After 做超时控制。

学完本章你将: 掌握 select/case/default、超时控制、非阻塞操作。


基本 select

go
package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        time.Sleep(100 * time.Millisecond)
        ch1 <- "来自 ch1"
    }()
    go func() {
        time.Sleep(50 * time.Millisecond)
        ch2 <- "来自 ch2"
    }()

    select {
    case msg := <-ch1:
        fmt.Println(msg)
    case msg := <-ch2:
        fmt.Println(msg)  // 这个先收到(50ms 更短)
    }
}

超时控制

go
select {
case result := <-ch:
    fmt.Println("结果:", result)
case <-time.After(3 * time.Second):
    fmt.Println("超时——3 秒内没有收到响应")
}

非阻塞操作

go
select {
case ch <- value:
    fmt.Println("发送成功")
default:
    fmt.Println("channel 满了,跳过发送")
}

select {
case v := <-ch:
    fmt.Println("收到:", v)
default:
    fmt.Println("没有数据,不等待")
}