go语言的time包(转载)
作者:waynehu
地址:go语言的time包
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)
表示睡多少时间,睡觉时,是阻塞状态
1 2 3 4 5 | fmt.Println( "start sleeping..." ) time.Sleep(time.Second) fmt.Println( "end sleep." ) //【结果】打印start sleeping后,等了正好1秒后,打印了end sleep //会阻塞,Sleep时,什么事情都不会做 |
After函数 time.After(time.Duration)
和Sleep差不多,意思是多少时间之后,但在取出管道内容前不阻塞
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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) |

AfterFunc函数 time.AfterFunc(time.Duration,func())
和After差不多,意思是多少时间之后在goroutine line执行函数
1 2 3 4 5 6 7 8 | f := func () { fmt.Println( "Time out" ) } time.AfterFunc(1*time.Second, f) time.Sleep(2 * time.Second) //要保证主线比子线“死的晚”,否则主线死了,子线也等于死了 //【结果】运行了1秒后,打印出timeout,又过了1秒,程序退出 //将一个间隔和一个函数给AfterFunc后 //间隔时间过后,执行传入的函数 |
由于f函数不是在Main Line执行的,而是注册在goroutine Line里执行的
所以一旦后悔的话,需要使用Stop命令来停止即将开始的执行,如果已经开始执行就来不及了
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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)它<br><br> |
Tick函数 time.Tick(time.Duration)
和After差不多,意思是每隔多少时间后,其他与After一致
1 2 3 4 5 6 7 8 | 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 |
ime.Time的方法
(time.Time自己独有的函数) ###Before & After方法 判断一个时间点是否在另一个时间点的前面(后面),返回true或false
1 2 3 4 5 6 7 | 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)
1 2 3 4 5 6 | 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一个时长,获得另一个时间点
1 2 3 | t1:=time.Now() //现在是12点整(假设),那t1记录的就是12点整 t2:=t1.Add(time.Hour) //那t1的时间点 **加上(Add)** 1个小时,是几点呢? fmt.Println(t2) //13点(呵呵) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2019-02-18 Django之url路由