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 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)

这些常量是在time包中进行 time 格式化 和 time 解析而预定义的一些常量,其实他们使用的都是一个特定的时间:

  Mon Jan 2 15:04:05 MST 2006

这个时间是 Unix time 1136239445,因为MST是 GMT-0700,所以这个指定的时间也可以看做

  01/02 03:04:05PM '06 -0700

可见程序猿也有调皮的一面.

因此我们只需要利用上面这些时间变可以随意的指定自己的时间格式,例如:

layout := "01__02-2006 3.04.05 PM"
fmt.Println(time.Now().Format(layout))

便会输出类似的时间:11__26-2014 8.40.00 PM

2. 函数

1. time 组成

time.Duration(时间长度,消耗时间)
time.Time(时间点)
time.C(放时间的channel通道)(注:Time.C:=make(chan time.Time))

2. After 函数

func After(d Duration) <-chan Time
表示多少时间之后,但是在取出channel内容之前不阻塞,后续程序可以继续执行 func Sleep(d Duration)
表示休眠多少时间,休眠时处于阻塞状态,后续程序无法执行.

举例说明二者区别:

fmt.Println("hello")
chan := time.After(time.Secone*1)
fmt.Println("World")
fmt.Println("hello")
chan := time.Sleep(time.Secone*1)
fmt.Println("World")

第一个程序在执行完输出 hello 后,接着便输出 world,不用等待 1s,但是 1s 后,chan 中有数据,则会打印出来;

第二个程序 chan 阻塞,则在输出 hello 后,程序变休眠 1s 中,然后才输出 World.

由此可见阻塞和非阻塞便是这两个函数的本质区别.

鉴于After特性,其通常用来处理程序超时问题,如下所示:

select {
case m := <-c:
handle(m)
case <-time.After(5 * time.Minute):
fmt.Println("timed out")
}

3. 重复执行的函数

func Tick(d Duration) <-chan Time

time.Tick(time.Duration) 用法和 time.After 差不多,但是它是表示每隔多少时间之后,是一个重复的过程,其他与 After 一致

type Ticker  //主要用来按照指定的时间周期来调用函数或者计算表达式,通常的使用方式是利用go新开一个协程使用,它是一个断续器
func NewTicker(d Duration) *Ticker //新生成一个ticker,此Ticker包含一个channel,此channel以给定的duration发送时间。duration d必须大于0
func (t *Ticker) Stop() //用于关闭相应的Ticker,但并不关闭channel

使用时间控制停止ticker

ticker := time.NewTicker(time.Millisecond * 500)
go func() {
for t := range ticker.C {
fmt.Println("Tick at", t)
}
}() time.Sleep(time.Millisecond * 1500) //阻塞,则执行次数为sleep的休眠时间/ticker的时间
ticker.Stop()
fmt.Println("Ticker stopped")

使用channel控制停止ticker

ticker := time.NewTicker(time.Millisecond * 500)
c := make(chan int,num) //num为指定的执行次数
go func() {
for t := range ticker.C {
c<-1
fmt.Println("Tick at", t) }
}() ticker.Stop()

这种情况下,在执行 num 次以 Ticker 时间为单位的函数之后,c channel 中已满,以后便不会再执行对应的函数.

Go_20: Golang 中 time 包的使用的更多相关文章

  1. golang 中 sync包的 WaitGroup

    golang 中的 sync 包有一个很有用的功能,就是 WaitGroup 先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 ...

  2. Go_21: Golang 中 time 包的使用二

    常量声明: const TimeLayout = "2006-01-02 15:04:05" 这是个奇葩,必须是这个时间点,据说是 go 诞生之日, 记忆方法:6-1-2-3-4- ...

  3. golang中context包学习

    摘要 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开仟程的生命周期, 在go语言中,只能通过channel + select来实现,但不够直观,感觉很绕. ...

  4. [Go] golang中的包管理

    在配置了环境变量$GOPATH后,比如下面这个路径 export GOPATH=/mnt/f/ubuntu/goProject 在这个路径下面会有这几个目录 在src目录下放着我的源码比如: 在同一个 ...

  5. golang中time包的使用

    一.代码 package main; import ( "time" "fmt" ) func main() { //time.Time代表一个纳秒精度的时间点 ...

  6. golang中json包序列化与反序列化

    package main import ( "encoding/json" "fmt" "reflect" ) type Info stru ...

  7. golang 中strconv包用法

    链接:https://studygolang.com/articles/5003 http://www.cnblogs.com/golove/p/3262925.html

  8. golang中time包一个简单的时间格式输出

    一.代码 package main import ( "fmt" "time" ) func main() { //"2006-01-02 15:04 ...

  9. 关于golang中某些包无法下载的解决方法

    由于某些不可描述的原因,我们 在go module 环境下(啥?这个不知道是啥?赶紧恶补下)进行go get xxxx时,会发现一些依赖库无法访问(不要问为什么无法访问). 解决办法 戳这里:http ...

随机推荐

  1. 导出excel失败,提示提示加载类型库/DDL出错

    首先,这里提供的解决办法仅适用于出现如下异常的情况:无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“M ...

  2. java判断字符串编码

    是 public static String getEncoding(String str){ String encoding = "UTF-8"; try { if (str.e ...

  3. Task 6.2冲刺会议十 /2015-5-23

    今天是第一个冲刺阶段的最后一天,主要把做出来的程序进行了初步的测试,在一台笔记本上运行程序,摄像头可以工作也能听到声音和麦克多的运转也还可以,两台计算机同时在一个局域网中通信的时候也可以实现.不过后续 ...

  4. object-oriented first work

    前言:在星期三的第一次面向对象程序设计课,遇见我们的栋哥,初次见面,发现老师的幽默.....下课后,就给我们一道作业题目... 作业要求:Create a program that asks for ...

  5. SQL语句中order_by_、group_by_、having的用法区别

    order by 从英文里理解就是行的排序方式,默认的为升序. order by 后面必须列出排序的字段名,可以是多个字段名. group by 从英文里理解就是分组.必须有“聚合函数”来配合才能使用 ...

  6. RabbitMQ使用笔记

    一.安装 1.下载所需安装包 下载服务端(原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的):http://www.rabbitmq.com/install-windows.htm ...

  7. k米案例分析

    K米产品分析 第一部分 调研.评测 评测 上手体验 大一暑假的时候,在ktv和同学唱k的时候就接触过了. - -.所以对于k米的第一次上手体验已经不记得了(ps:尴尬)!~其实以前用它的时候想法很简单 ...

  8. Delphi 获取Ip地址的方法总结

    通过注册表获取或修改Ip 想到Windows会把系统网卡相关信息存入注册表,肯定可通过注册表读取具体ip信息.大致思路是找HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\W ...

  9. [C/C++] C++ Primer学习笔记

    记录下自己掌握不清楚的概念和用法... Day 1 endl:具有输出换行的效果,并刷新与设备相关联的缓冲区. 注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出 ...

  10. IE实现userData 永久存储

      注意:只支持IE5,及其以上的浏览器 //需要使用 if 条件注释 <!DOCTYPE html> <html> <head> <meta charset ...