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("没有数据,不等待")
}