GoLang time 模块

2018-03-26 language golang

GoLang 中的 time 模块包含了一些与时间相关的函数,例如格式转换、定时器等。

简介

golang 通过 time 包的函数初始化定时器,可以通过 reset()stop() 重置和停止定时器。另外,定时器存在一个 chan time.Time 类型的缓冲 channel 字段 C,时间到了之后,定时器就会向自己的 C 字段发送一个 time.Time 类型的元素值。

时间间隔

在 time 模块中,定义了一个 time.Duration 类型,实际上就是一个 int64 类型,同时定义了一些常用的宏定义。

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

定时器

最简单的定时器。

package main

import (
        "fmt"
        "time"
)

func main() {
        t := time.NewTimer(2 * time.Second)

        now := time.Now()
        fmt.Printf("Now time : %v.\n", now)

        expire := <-t.C
        fmt.Printf("Expiration time: %v.\n", expire)
}

Ticker

周期性的触发时间事件,会以指定的时间间隔重复的向通道 C 发送时间值。

package main

import (
        "fmt"
        "time"
)

func main() {
        var ticker *time.Ticker = time.NewTicker(1 * time.Second)

        go func() {
                for t := range ticker.C {
                        fmt.Println("Tick at", t)
                }
        }()

        time.Sleep(time.Second * 5)
        ticker.Stop()
        fmt.Println("Ticker stopped")
}

如果使用周期性的定时器,可以使用 time.Ticker 类型。

其它

package main

import (
        "fmt"
        "time"
)

func main() {
        time.AfterFunc(
                1*time.Second,
                func() {
                        fmt.Printf("Expire: %v.\n", time.Now())
                })
        time.Sleep(2 * time.Second)
}

可以将定时器字段 C 的大小输出,可以发现并没有缓冲任何值。也就是说,在给定了自定义函数后,默认的处理方法 (向C发送代表绝对到期时间的元素值) 就不会被执行了。