问题1:下面代码输出什么
package main
import (
"fmt"
"time"
)
func main() {
ticker1 := time.NewTicker(1 * time.Second)
ticker2 := time.NewTicker(2 * time.Second)
go func() {
for {
select {
case t1 := <-ticker1.C:
fmt.Println("1s ticker:", t1)
case t2 := <-ticker2.C:
fmt.Println("2s ticker:", t2)
default:
fmt.Println("default")
}
}
}()
time.Sleep(5 * time.Second)
fmt.Println("Done")
}
问题2:如果加上一行代码呢
package main
import (
"fmt"
"time"
)
func main() {
ticker1 := time.NewTicker(1 * time.Second)
ticker2 := time.NewTicker(2 * time.Second)
go func() {
for {
select {
case t1 := <-ticker1.C:
fmt.Println("1s ticker:", t1)
case t2 := <-ticker2.C:
fmt.Println("2s ticker:", t2)
default:
fmt.Println("default")
time.Sleep(1 * time.Second)
}
}
}()
time.Sleep(5 * time.Second)
fmt.Println("Done")
}
问题1的答案是会一直输出default,直到5s结束
问题2的答案是交替运行
default
1s ticker: 2024-11-13 13:37:09.5503567 +0800 CST m=+1.000307501
default
2s ticker: 2024-11-13 13:37:10.5503405 +0800 CST m=+2.000307501
1s ticker: 2024-11-13 13:37:10.5503405 +0800 CST m=+2.000307501
default
1s ticker: 2024-11-13 13:37:11.5503246 +0800 CST m=+3.000307501
default
2s ticker: 2024-11-13 13:37:12.5503087 +0800 CST m=+4.000307501
1s ticker: 2024-11-13 13:37:12.5503087 +0800 CST m=+4.000307501
default
Done
原因
select 语句中的 default 情况会执行是因为 select 语句默认会阻塞,直到其监听的通道中有数据可读。
如果没有通道准备好,select 就不会进入任何一个 case,而是继续阻塞等待。
default 分支没有被设计为在特定条件下退出循环,因此它会不断地打印 "default"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-11-13 Golang大杀器之pprof
2023-11-13 Golang 大杀器之trace
2023-11-13 GMP模型