分享一个select+定时器的一个代码

news/2024/11/14 14:39:14/文章来源:https://www.cnblogs.com/qcy-blog/p/18543761

问题1:下面代码输出什么

package mainimport ("fmt""time"
)func main() {// 创建两个定时器,一个间隔为1秒,另一个间隔为2秒ticker1 := time.NewTicker(1 * time.Second)ticker2 := time.NewTicker(2 * time.Second)// 在一个新的 goroutine 中运行监听逻辑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 mainimport ("fmt""time"
)func main() {// 创建两个定时器,一个间隔为1秒,另一个间隔为2秒ticker1 := time.NewTicker(1 * time.Second)ticker2 := time.NewTicker(2 * time.Second)// 在一个新的 goroutine 中运行监听逻辑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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832941.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正向代理理解

正向代理(由客户端代理)

冲刺Day1

Day1 当天站立式会议照片姓名 学号 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难林涛(组长) 3122004618 null 开发登录管理员api 如何进行password保密杨森 3122004629 null 后台文件上传开发 如何进行前后端文件上传协调钟礼骏 3122006504 null 查询家长感兴趣模块…

关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。

关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。电线截面积 (mm) 额定电流 (A) 适用功率 (W) (220V 电压) 适用功率 (W) (380V 电压)0.5 mm 5 A 1100 W 1900 W0.75 mm 8 A 1760 W 3040 W1.0 mm 10 A 220…

在线性坐标系中绘制对数函数图象

本文记述了用 Matplotlib 在线性坐标系中绘制对数函数图象的例子。 代码主体内容如下: ...def main():fig, ax = plt.subplots(figsize=(8,8)) #1ax = configure_axes(ax, Logarithmic Function, 8, 3, 1, 0.25, 1, 0.25) #2x = np.linspace(0.125, 8, 100) …

【JetBrains Rider 2024软件下载与安装教程】

1、安装包Rider2024: 链接:https://pan.quark.cn/s/f3b3360dccc0 提取码:Z8gA Rider-2023.3.2: 链接:https://pan.quark.cn/s/82b63a1e0df3 提取码:XdA8 2、安装教程(建议关闭杀毒软件) 1) 双击下载安装包exe文件安装,弹窗安装对话框2) 点击下一步3) …

推荐一个.NetCore开源的CMS项目,功能强大、扩展性强、支持插件的系统!

推荐一个基于.Net Core开发的开源CMS项目,该项目功能完善、涉及知识点比较多,不管是作为二次开发、还是学习都是不错的选择。01 项目简介 Cofoundry是基于.Net开发的、代码优先开发、具备可扩展且灵活的架构、简单易用的内容管理系统。02 项目框架 1、基于.Net 8开发。 2、数…

如何把markdown文件导出为pdf

1. 下载Prince [下载小工具] 下载后直接安装即可。 2. 添加环境变量先找到小工具的可执行文件Prince.exe的路径。.\Prince\engine\bin把Prince.exe的路径的添加到环境变量中,然后重启vscode。3. 在vs code中把md文件转换成pdfa. 先保证自己有Markdown Preview Enhanced插件, …

xv6 pingpong lab中 父进程parent应该先写后读,顺序不能变(注意是队列,不是栈)

按照图中顺序来写,pipe是队列,先进先出。读取肯定读最前面的,top。写入肯定写最后面back。注意与堆栈stack进行区分

AvaloniaVS2022

AvaloniaVS.VS2022安装和使用 首先下载VS2022专业版 https://visualstudio.microsoft.com/zh-hans/downloads/安装Avalonia for Visual Studio 2022扩展包这里直接安装经常失败,我下载AvaloniaVS.VS2022.vsix 单独安装,直接以管理员安装就可以,时间有点长,耐心等待打开VS20…

Java初识(一)

运行机制:语言处理程序主要分为汇编程序,编译程序,解释程序 效率(编译>解释) 灵活性(编译<解释) 可移植性(编译<解释) 在解释方式下,翻译源程序时不生成独立的目标程序,而编译器则将源程序翻译成独立保存的目标程序 Java解释型面向对象编程语言 基于Java开…

【日记】世界上居然有压力这么大的工作(1079 字)

正文眼睛好疼。今晚的应酬没跑掉,毕竟是全行性质的,也跑不了。还好底层员工自动一桌,领导一桌。领导那桌各种喝酒、陪客、讲话,员工这桌就只有:“啊,这菜好咸。” 或者是:“你们有谁要酸奶的?”拿过来的酸奶是常温的,不是那种粘稠的。坏耶。明天还要单独找我们柜面两个…