文档章节

go语言的time包

waynehu
 waynehu
发布于 2013/08/02 11:50
字数 1244
阅读 5.6W
收藏 32

#go语言的time包 ##组成

  • time.Duration(时长,耗时)
  • time.Time(时间点)
  • time.C(放时间点的管道)[ Time.C:=make(chan time.Time) ]

time包里有2个东西,一个是时间点,另一个是时长
时间点的意思就是“某一刻”,比如 2000年1月1日1点1分1秒 那一刻(后台记录的是unix时间,从1970年开始计算)
时长就是某一刻与另一刻的差,也就是耗时

##函数 ###Sleep函数 time.Sleep(time.Duration)
表示睡多少时间,睡觉时,是阻塞状态

fmt.Println("start sleeping...")
time.Sleep(time.Second)
fmt.Println("end sleep.")
//【结果】打印start sleeping后,等了正好1秒后,打印了end sleep
//会阻塞,Sleep时,什么事情都不会做

time.sleep

###After函数 time.After(time.Duration)
和Sleep差不多,意思是多少时间之后,但在取出管道内容前不阻塞

fmt.Println("the 1")
tc:=time.After(time.Second) //返回一个time.C这个管道,1秒(time.Second)后会在此管道中放入一个时间点(time.Now())
                        //时间点记录的是放入管道那一刻的时间值
fmt.Println("the 2")
fmt.Println("the 3")
<-tc   //阻塞中,直到取出tc管道里的数据
fmt.Println("the 4")
//【结果】立即打印123,等了1秒不到一点点的时间,打印了4,结束
//打印the 1后,获得了一个空管道,这个管道1秒后会有数据进来
//打印the 2,(这里可以做更多事情)
//打印the 3
//等待,直到可以取出管道的数据(取出数据的时间与获得tc管道的时间正好差1秒钟)
//打印the 4

time.After1

fmt.Println("the 1")
tc:=time.After(time.Second * 2) //返回一个time.C这个管道,2秒(time.Second × 2)后会在此管道中放入
                        //一个时间点(time.Now()),时间点记录的是放入管道那一刻的时间值
fmt.Println("the 2")
fmt.Println("the 3")
time.Sleep(time.Second)//这里是假设这个Println动作执行了半秒钟
fmt.Println("the 4")
time.Sleep(time.Second)//这里是假设这个Println动作执行了半秒钟
fmt.Println("the 5")
fmt.Println("the 6")
fmt.Println("the 7")
<-tc   //阻塞中,直到取出tc管道里的数据
fmt.Println("the 8")
//【结果】立即打印1和2和3,等了1秒打印了4,打完后又等了1秒打印了5,然后又立即打印了678,结束
//这里的<-tc是立即能获得数据的
//因为早在执行差不多Print 5的时候,管道内已经有数据了
//当gorotine线把数据丢到管道中后,它自己阻塞了(具体请了解goroutine)

time.After2

###AfterFunc函数 time.AfterFunc(time.Duration,func())
和After差不多,意思是多少时间之后在goroutine line执行函数

f := func() {
    fmt.Println("Time out")
}
time.AfterFunc(1*time.Second, f)
time.Sleep(2 * time.Second) //要保证主线比子线“死的晚”,否则主线死了,子线也等于死了
//【结果】运行了1秒后,打印出timeout,又过了1秒,程序退出
//将一个间隔和一个函数给AfterFunc后
//间隔时间过后,执行传入的函数

time.AfterFunc

由于f函数不是在Main Line执行的,而是注册在goroutine Line里执行的
所以一旦后悔的话,需要使用Stop命令来停止即将开始的执行,如果已经开始执行就来不及了

houhui := true
f := func() {
    fmt.Println("Time out")
}
ta := time.AfterFunc(2*time.Second, f)
time.Sleep(time.Second)
if houhui {
    ta.Stop()
}
time.Sleep(3 * time.Second)    //要保证主线比子线“死的晚”,否则主线死了,子线也等于死了
//【结果】运行了3秒多一点点后,程序退出,什么都不打印
//注册了个f函数,打算2秒后执行
//过了1秒后,后悔了,停掉(Stop)它

###Tick函数 time.Tick(time.Duration)
和After差不多,意思是每隔多少时间后,其他与After一致

fmt.Println("the 1")
tc:=time.Tick(time.Second) //返回一个time.C这个管道,1秒(time.Second)后会在此管道中放入一个时间点,
                        //1秒后再放一个,一直反复,时间点记录的是放入管道那一刻的时间
for i:=1;i<=2;i++{
    <-tc
    fmt.Println("hello")
}
//每隔1秒,打印一个hello

time.Tick

##time.Time的方法(time.Time自己独有的函数) ###Before & After方法 判断一个时间点是否在另一个时间点的前面(后面),返回true或false

t1:=time.Now()
time.Sleep(time.Second)
t2:=time.Now()
a:=t2.After(t1)     //t2的记录时间是否在t1记录时间的**后面**呢,是的话,a就是true
fmt.Println(a)       //true
b:=t2.Before(t1)     //t2的记录时间是否在t1记录时间的**前面**呢,是的话,b就是true
fmt.Println(b)       //false

###Sub方法 两个时间点相减,获得时间差(Duration)

t1:=time.Now()
time.Sleep(time.Second)
t2:=time.Now()
d:=t2.Sub(t1)     //时间2减去时间1
fmt.Println(d)       //打印结果差不多为1.000123几秒,因为Sleep无法做到精确的睡1秒
后发生的时间  减去   先发生时间,是正数

###Add方法 拿一个时间点,add一个时长,获得另一个时间点

t1:=time.Now()              //现在是12点整(假设),那t1记录的就是12点整
t2:=t1.Add(time.Hour)          //那t1的时间点 **加上(Add)** 1个小时,是几点呢?
fmt.Println(t2)       //13点(呵呵)

© 著作权归作者所有

waynehu
粉丝 35
博文 69
码字总数 36444
作品 0
静安
私信 提问
加载中

评论(3)

waynehu
waynehu 博主

引用来自“李轩Lane”的评论

第三段代码:
1、time.Second * 0.5 编译错误constant 0.5 truncated to integer。因为time.Second是int64
2、//【结果】立即打印1和2,花了半秒打印了3和4,然后又立即打印了5678,结束。应该是//【结果】立即打印1和2和3,花了半秒打印了4,又花半秒打印了5,然后又立即打印了678,结束
谢谢,已修改,为了防止新手看不懂类型转换,故将原来的1秒改为2秒,以避免类型转换代码
李轩Lane
李轩Lane
第三段代码:
1、time.Second * 0.5 编译错误constant 0.5 truncated to integer。因为time.Second是int64
2、//【结果】立即打印1和2,花了半秒打印了3和4,然后又立即打印了5678,结束。应该是//【结果】立即打印1和2和3,花了半秒打印了4,又花半秒打印了5,然后又立即打印了678,结束
qinerg
qinerg
嗯,go的基础库用着还是挺方便的
R语言-分析nginx日志

R语言分析nginx日志 nginx日志举例 172.16.1.1 - - [04/Feb/2015:23:40:01 +0800] "POST /api/message/query HTTP/1.1" 200 52 "-" "Apache-HttpClient/4.2 (java 1.5)" "-" "message.test.c......

openthings
2015/12/16
128
0
WIN10英文版改中文

最近一位老师让我帮他把笔记本电脑分一下区。我去他家取电脑时,看到他的电脑里夹着张纸条,上面写着“copy--复制”等等,便问怎么回事。老师道出原委:这本子是他在加拿大生活的儿子送的,自...

smellyman
2017/04/07
0
0
CentOS7中文语言乱码问题解决

1.安装中文语言包 先查看系统是否有安装中文语言包 # locale -a (列出所有可用的公共语言环境的名称) 若发现以上几项,说明系统已安装中文语言包,无需再安装,那这几项代表什么意思呢? ...

河图再现
2018/04/19
888
0
Go 1.9 发布,包含语言,标准库,以及运行时的诸多变化

今天Go团队很高兴地宣布发布1.9版本。现可供下载。发行说明中最突出得的是包含语言,标准库,以及运行时的诸多变化。这个版本中的大部分工作都是对运行时和工具的改进。 主要更新内容如下: ...

两味真火
2017/08/25
8K
51
Play中的引用其他项目包

Play 1.2.3 中主要包括的第三方包有 xstream xml与obejct互转 snakeyaml yaml解析与发射 slf4j 日志接口相关 signpost Oauth相关,第三方帐号协议 postgresql postgresql数据库驱动 oval Obj...

刀狂剑痴
2015/08/27
78
0

没有更多内容

加载失败,请刷新页面

加载更多

springcloud微服务实战_09_消息驱动

9.1 spring cloud stream 简介 spring cloud stream 是一个用来为微服务应用提供消息驱动能力的框架. 它可以基于 springboot 来单独的创建独立的,可用于生产的 spring 的应用程序. 它通过使用...

SP_K
8分钟前
29
0
福昕PDF编辑器个人版不能登录多个电脑问题处理

问题 福昕PDF编辑器个人版,只能在两台电脑登录,而且不能同时登录。但是当买换了新电脑后,新电脑属于第三台电脑,就不能登录使用编辑功能了。 解决 打开“我的电脑”,搜索出如下文件,删除...

InfoInit
20分钟前
51
0
pandas操作excel-08-简单绘图-柱状图

import pandas as pdimport matplotlib.pyplot as pltstudents = pd.read_excel('D:/output.xlsx', index_col='idx')students.sort_values(by='SinglePrice', inplace=True, ascending=......

烽焱10仴
21分钟前
25
0
向点击事件监听器添加“返回假”有什么作用?

很多次,我在HTML页面中都看到过这样的链接: <a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a> 那里return false有什么作用? 另外,我通常不会在按钮中看到它......

技术盛宴
27分钟前
25
0
搞不定Kafka重复消费?来看看就不一样了

前言 今天我们聊一个话题,这个话题大家可能在面试过程中,或者是工作当中经常遇到 :point_right: 如何保证 Kafka 消息不重复消费? 我们在做开发的时候为了程序的健壮性,在使用 Kafka 的时...

Java进阶程序员xx
37分钟前
43
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部