Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go语言中常见100问题-#75 Providing a wrong time duration

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

作者头像
数据小冰
发布于 2022-08-15 07:28:19
发布于 2022-08-15 07:28:19
18900
代码可运行
举报
文章被收录于专栏:数据小冰数据小冰
运行总次数:0
代码可运行
提供错误的duration时间值

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang中time包用法--转
time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02
李海彬
2018/03/20
4.2K0
记一次使用time.Duration类型踩过的坑
大家好,我是渔夫子。今天跟大家聊聊time. Duration类型及其使用。为什么要讲这个呢,是因为最近在写代码时踩到了一个坑,为了避免大家在今后也踩同样的坑,就跟大家聊聊该类型的使用。
Go学堂
2023/01/31
7040
time 用法大全
type Duration int64 持续时间表示两个瞬间之间的经过时间,为int64纳秒计数。
酷走天涯
2019/05/26
1.2K0
Golang内置包-time
时间离我们仅在咫尺,无论是在编程中时间还是日常生活中对于时间的 记述都是离我们最近的,那么让我们一起来学习一下GoLang中内置包time。
PayneWu
2020/12/18
8760
微服务-高并发下接口如何做到优雅的限流
通俗的来讲,一根管子往池塘注水,池塘底部有一个口子往外出水,当注水的速度过快时,池塘的水会溢出,此时,我们的做法换根小管子注水或者把注水管子的口堵住一半,这就是限流,限流的目的就是为了防止池塘的水溢出,放在软件开发中,一台硬件的CPU和内存总归是有限的,能处理的请求量是有一个阈值的,就跟人的精力一样是有限的,超过这个限度系统就会异常,人就会生病。
阿伟
2020/03/26
1.1K0
【Golang】理解Golang中的time.Duration
Duration 将两个瞬间之间的经过时间表示为 int64 纳秒计数。 该表示将最大可表示持续时间限制为大约 290 年。
唯一Chat
2022/07/24
2.8K0
Go语言计时器的使用详解
Go语言的标准库里提供两种类型的计时器Timer和Ticker。Timer经过指定的duration时间后被触发,往自己的时间channel发送当前时间,此后Timer不再计时。Ticker则是每隔duration时间都会把当前时间点发送给自己的时间channel,利用计时器的时间channel可以实现很多与计时相关的功能。
KevinYan
2020/05/14
2.4K0
Go 定时器:Timer 和 Ticker
在日常开发中,我们可能会遇到需要延迟执行或周期性地执行一些任务。这个时候就需要用到 Go 语言中的定时器。
陈明勇
2024/01/23
1.6K6
Go 定时器:Timer 和 Ticker
Go之time包用法
time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。 time 类型 type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in nanoseconds. // // From high to low bit position, wall encodes a 1-bit flag (hasMon
孤烟
2022/03/19
3980
Golang之时间、日期类型
孤身只影的一直小地鼠,艰难的走在路上 package main import ( "fmt" "time" ) //获取时间的格式 func testTime() { now := time.Now() fmt.Printf("current time:%v\n", now) year := now.Year() month := now.Month() day := now.Day() hour := now.Hour() mi
超蛋lhy
2018/08/31
4.1K0
Golang包——time
毫秒和纳秒是两的时间单位 1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000纳秒
羊羽shine
2019/05/29
1.2K0
一文搞懂Go语言标准库,Time
在编程过程中,我们经常会用到与时间和日期相关的各种需求,下面来介绍 Go 语言中有关时间的一些基本用法。
微客鸟窝
2021/12/27
5440
GO的定时器Timer 和定时任务cron
要是对GO 中 swaggo 的应用还有点兴趣的话,可以查看文章 工作中后端是如何将API提供出去的?swaggo很不错
阿兵云原生
2023/02/16
1.2K0
golang 定时器封装——支持超时和函数自定义
如标题,封装一个golang的定时器,能够设置超时时间和定时器的interval。开启定时器后使用一个新的goroutine进行倒计时操作。
Java架构师必看
2021/05/14
5730
Golang之旅21-time模块使用
time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年、月、日、时、分、秒等信息。
皮大大
2021/03/02
5190
go的日期操作类使用-日常使用类库no.1
我这里接下来的几个文章主要是讲解日常的业务中或者代码中使用的类库,下面我们来看代码。
公众号-利志分享
2022/04/25
3470
Golang深入浅出之-Go语言中的时间与日期处理:time包详解
在Go语言中,time包提供了丰富而强大的功能来处理时间和日期,这对于构建精确计时、定时任务、日期格式化等应用场景至关重要。本文将深入浅出地探讨time包的核心概念、常见问题、易错点及其规避策略,并通过实用代码示例加深理解。
Jimaks
2024/04/29
1.9K0
分布式高并发系统限流原理与实践
随着业务的发展壮大,对后端服务的压力也会越来越大,为了打造高效稳定的系统, 产生了分布式,微服务等等系统设计,因为这个原因,设计复杂度也随之增加,基于此 诞生了高并发系统三大利器限流,缓存,降级/熔断。
merlinfeng
2020/12/31
8570
分布式高并发系统限流原理与实践
k8s 中定时任务的实现
k8s 中有许多优秀的包都可以在平时的开发中借鉴与使用,比如,任务的定时轮询、高可用的实现、日志处理、缓存使用等都是独立的包,可以直接引用。本篇文章会介绍 k8s 中定时任务的实现,k8s 中定时任务都是通过 wait 包实现的,wait 包在 k8s 的多个组件中都有用到,以下是 wait 包在 kubelet 中的几处使用:
田飞雨
2019/12/19
1.5K0
Go定时任务实现
定时任务调度是常见的场景,从简单点本地任务调度,到分布式定时任务调度,被广泛的使用。本文汇总了 awesome-go 里全部的本地定时任务库,并横向对比其实现原理,以及使用场景和优缺点,欢迎收藏随时参考。
味笼
2023/02/26
1.3K0
相关推荐
Golang中time包用法--转
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验