Golang基础-- select的用法
select是golang在语言层面提供的多路IO复用的机制,其可以检测多个channel是否ready
三个题目示例来说明一下select的大概作用:
题目一:
声明两个channel,分别为chan1和chan2,依次启动两个协程,分别向两个channel中写入一个数据就进入 睡眠。select语句两个case分别检测chan1和chan2是否可读,如果都不可读则执行default语句。
import ( "fmt" "time" ) func main() { chan1 := make(chan int) chan2 := make(chan int) go func() { chan1 <- 1 time.Sleep(time.Second * 10) }() go func() { chan2 <- 2 //time.Sleep(time.Second) }() select { case <-chan1: fmt.Println("channel1 ready") case <-chan2: fmt.Println("channel2 ready") default: fmt.Println("default") } fmt.Println("main exit") }
select中各个case执行顺序是随机的,如果某个case中的channel已经ready,则执行相应的语句并退 出select流程,如果所有case中的channel都未ready,则执行default中的语句然后退出select流程。另外, 由于启动的协程和select语句并不能保证执行顺序,所以也有可能select执行时协程还未向channel中写入数据, 所以select直接执行default语句并退出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通