标准库中的某些函数或方法会接受一个time.Duration(持续时间)类型参数,然而该类型是一个int64类型的别名,新手Go开发人员在刚开始使用的时候可能会感到困惑并提供了错误的持续时间值。例如有Java或JavaScript语言背景的开发人员习惯传递一个数字给参数为time.Duration的函数或方法。
为了解释清楚这个常见的错误,通过具体的例子进行说明。该例子期望创建一个周期为1秒的定时器time.Ticker
,代码如下。如果运行这段代码,会发现定时器的周期并不是我们期望的1秒,而是1微秒。
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,像下面这样。
ticker = time.NewTicker(time.Microsecond)
// Or
ticker = time.NewTicker(1000 * time.Nanosecond)
本文提到的这个常见错误理解起来并不复杂,但是,具有其他语言背景的开发人员在使用Go语言开发时很容易进入陷阱,误以为time包中函数或方法接收的持续时间单位是毫秒。为了避免这类错误,我们应该始终使用time.Duration的API,传参时带上单位。像time.Microsecond = 1 * time.Microsecond
这样采用「数*时间单位」形式。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有