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.