利用 select + fallthrough 实现非阻塞多路复用
探索 select 语句中 fallthrough 的隐藏用法,构建超时和默认路径组合的非阻塞通道操作。 · 难度:入门 · +10XP
select + fallthrough 的非阻塞技巧
Go 的 select 语句通常用于等待多个 channel 操作,但配合 fallthrough 可以实现更复杂的控制流。本教程展示如何利用 fallthrough 在 case 之间传递逻辑,结合 default 分支实现非阻塞发送/接收,并且处理超时和优先级。注意:fallthrough 只在 case 末尾显式写出时生效,且不能穿透到下一个 case 的初始化表达式。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string, 1)
ch2 := make(chan string, 1)
ch1 <- "msg1"
select {
case msg := <-ch1:
fmt.Println("from ch1:", msg)
fallthrough
case msg := <-ch2:
fmt.Println("from ch2:", msg)
default:
fmt.Println("no message ready")
}
time.Sleep(10 * time.Millisecond)
}