Post

select

Go 的 select 用于同时监听多个 channel 操作,底层由 runtime 的 selectgo 函数实现。

执行时 runtime 会先随机打乱 case 顺序,然后遍历所有 case,检查对应 channel 是否 ready。如果有多个 ready,会随机选择一个执行;

如果都没有 ready 且存在 default,则执行 default;

如果没有 default,则当前 goroutine 会注册到所有 channel 的等待队列并阻塞。当某个 channel 就绪时,runtime 会唤醒该 goroutine 执行对应 case。

时间复杂度:O(n),n 是 case 的数量。

This post is licensed under CC BY 4.0 by the author.