前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言中常见100问题-#75 Providing a wrong time duration

Go语言中常见100问题-#75 Providing a wrong time duration

作者头像
数据小冰
发布2022-08-15 15:28:19
1660
发布2022-08-15 15:28:19
举报
文章被收录于专栏:数据小冰
提供错误的duration时间值

标准库中的某些函数或方法会接受一个time.Duration(持续时间)类型参数,然而该类型是一个int64类型的别名,新手Go开发人员在刚开始使用的时候可能会感到困惑并提供了错误的持续时间值。例如有Java或JavaScript语言背景的开发人员习惯传递一个数字给参数为time.Duration的函数或方法。

为了解释清楚这个常见的错误,通过具体的例子进行说明。该例子期望创建一个周期为1秒的定时器time.Ticker,代码如下。如果运行这段代码,会发现定时器的周期并不是我们期望的1秒,而是1微秒。

代码语言:javascript
复制
ticker := time.NewTicker(1000)
for {
        select {
        case <-ticker.C:
                // Do something
        }
}

time.Duration实际上是int64类型的别名,所以上述代码中将1000传给time.NewTicker是没有问题的,因为1000是一个有效的int64类型值。然而,time.Duration表示两个时间点之间经过的时间,它的单位是纳秒。这里传的是1000纳秒,也就是1微秒。所以问题原因是没有搞清楚time.Duration时间单位。

因此,如果我们想创建一个周期为1微秒的定时器,为了避免上面的问题,好的处理方法是不直接传递一个int64类型的数给time.NewTicker,而是始终采用time.Duration提供的API,像下面这样。

代码语言:javascript
复制
ticker = time.NewTicker(time.Microsecond)
// Or
ticker = time.NewTicker(1000 * time.Nanosecond)

本文提到的这个常见错误理解起来并不复杂,但是,具有其他语言背景的开发人员在使用Go语言开发时很容易进入陷阱,误以为time包中函数或方法接收的持续时间单位是毫秒。为了避免这类错误,我们应该始终使用time.Duration的API,传参时带上单位。像time.Microsecond = 1 * time.Microsecond这样采用「数*时间单位」形式。

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

本文分享自 数据小冰 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 提供错误的duration时间值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档