不管是在Java,还是Golang,都是有时间相关的标准库的,在Java上,time或者说date一度都是被广大开发者所诟病的,所以Java也出现了大量的有关时间的第三库。今天要讲的其实跟Java的这些库没什么关系,而是说说Golang里面的time标准库。

提Java,主要是为了黑一下而已,同感/反感的都可以有一点谈资。

Golang的开发文档非常方便,如果有网络就直接上https://godoc.org/搜索吧。这个都是开发人员必备了,也不多说。

time

https://godoc.org/time

time 包提供了测量和显示功能,并且它的计算都是格林威治时间。

time提供了很多方便可用的函数,可以结合channel,可以实现出 scheduler,task等更丰富的工具和库。

beego中也提供了task功能,大家有兴趣可以看看源码。

Terry-mao实现了一个timer,大家有兴趣可以去看看。

我今天讲的主要是time#Duration

Duration的官方文档描述

A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.

重点关注关注Duration是被定义为int64,然后它的单位是nanosecond。所以我们在使用方法的时候要特别注意了

func (t Time) Add(d Duration) Time

func Sleep(d Duration)

等等吧,因为Duration是int64的自定义类型,所以当我们这样用的时候,也是可以正常运行的。

time.Sleep(20000)

据我有限的编程了解,Java程序员,应该都想当然的认为程序会被Sleep 20秒吧。但是实际上,程序只会Sleep 20微秒。一般来说这个不会对我们感知有任何中断的感觉。

从doc上,我们能看到Golang标准库给我们提供的是这样的常量定义:

const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute )

随着对Golang开发的逐步深入,我相信每个人都会标准库的用法普及到自己的日常开发中,比方说这里的常量定义,这样我们在使用的时候,会很方便。

time.Sleep(20*time.Second)

是不是很简洁,很清晰!

接着再说一下Month

在Java语言,Month是整型,并且是从0开始的,各种坑爹是不是有遇到呢。在Golang中,我就不多说,直接看源码吧

const ( January Month = 1 + iota February March April May June July August September October November December )

所以我们在开发过程中的时候,一定要了解清楚他的表面含义下,真正的数值是多少。

我们对于任何事物都要有追根溯源的精神,只有这样你才清楚的知道他为什么那样,并且在又疑问或者产生问题的时候,我们才知道才知道原因,才知道怎么办!