前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >转-Golang语言-里面select-case和time.Ticker的使用注意事项

转-Golang语言-里面select-case和time.Ticker的使用注意事项

作者头像
李海彬
发布2018-03-21 11:31:53
1.2K0
发布2018-03-21 11:31:53
举报
文章被收录于专栏:Golang语言社区

上周末参加Go技术聚会,京东的美女工程师讲到一个select-case和time.Ticker的使用注意事项(真实的应用场景是:在测试收包的顺序的时候,加了个tick就发现丢包了),觉得很有意思,记录一下。

问题出在这个select里面:

select { case ch <- i: case <-tick.C: fmt.Printf("%d: case <-tick.C\n", i) }

当两个case条件都满足的时候,运行时系统会通过一个伪随机的算法决定哪个case将会被执行 所以当tick.C条件满足的那个循环,有某种概率造成ch<-i没有发送(虽然通道两端没有阻塞,满足发送条件) 解决方案1: 一旦tick.C随机的case被随机到,就多执行一次ch<-i (不体面,如果有多个case就不通用了) select { case ch <- i: case <-tick.C: fmt.Printf("%d: case <-tick.C\n", i) ch <- i } 解决方案2: 将tick.C的case单独放到一个select里面,并加入一个default(保证不阻塞) select { case ch <- i: } select { case <-tick.C: fmt.Printf("%d: case <-tick.C\n", i) default: }

两种解决方案的输出都是希望的结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档