Go_20: Golang 中 time 包的使用
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 包的使用的更多相关文章
- golang 中 sync包的 WaitGroup
golang 中的 sync 包有一个很有用的功能,就是 WaitGroup 先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 ...
- Go_21: Golang 中 time 包的使用二
常量声明: const TimeLayout = "2006-01-02 15:04:05" 这是个奇葩,必须是这个时间点,据说是 go 诞生之日, 记忆方法:6-1-2-3-4- ...
- golang中context包学习
摘要 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开仟程的生命周期, 在go语言中,只能通过channel + select来实现,但不够直观,感觉很绕. ...
- [Go] golang中的包管理
在配置了环境变量$GOPATH后,比如下面这个路径 export GOPATH=/mnt/f/ubuntu/goProject 在这个路径下面会有这几个目录 在src目录下放着我的源码比如: 在同一个 ...
- golang中time包的使用
一.代码 package main; import ( "time" "fmt" ) func main() { //time.Time代表一个纳秒精度的时间点 ...
- golang中json包序列化与反序列化
package main import ( "encoding/json" "fmt" "reflect" ) type Info stru ...
- golang 中strconv包用法
链接:https://studygolang.com/articles/5003 http://www.cnblogs.com/golove/p/3262925.html
- golang中time包一个简单的时间格式输出
一.代码 package main import ( "fmt" "time" ) func main() { //"2006-01-02 15:04 ...
- 关于golang中某些包无法下载的解决方法
由于某些不可描述的原因,我们 在go module 环境下(啥?这个不知道是啥?赶紧恶补下)进行go get xxxx时,会发现一些依赖库无法访问(不要问为什么无法访问). 解决办法 戳这里:http ...
随机推荐
- Journal entry of the thirteenth chapter to chapter seventeenth(第十三章和十七章阅读与疑问)
第十三章: 软件测试的意义在于: a. 发现软件错误: b. 有效定义和实现软件成分由低层到高层的组装过程: c. 验证软件是否满足任务书和系统定义文档所规定的技术要求: d. ...
- SQL Server 无法连接到本地服务器
未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接: 解决办法: 在服务中启动SQL Server (MSSQLSERVER)这个服务.
- iOS App之间常用的五种通信方式及适用场景总结
iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行,每个App都只能读取iPhone上iOS系统为该应用程序程序创建的文件夹AppData下的内容,不能随意跨越自己的沙盒去访问 ...
- Java网络编程一:基础知识详解
网络基础知识 1.OSI分层模型和TCP/IP分层模型的对应关系 这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍. 2.七层模型与协议的对应关系 网络层 ------------ ...
- sed ,awk , cut三剑客的区别
sed: sed只能截取文件中以行的来截取数据,,(grep命令可以过滤到某一行) 例如: [root@localhost ~]# sed -n '2,3p' /etc/passwd ...
- #Leetcode# 707. Design Linked List
https://leetcode.com/problems/design-linked-list/ Design your implementation of the linked list. You ...
- 获取SQL Server中连接的客户端IP地址[转]
有时候需要获取连接到SQL Server服务器上的客户端IP地址,用什么办法呢? SELECT *FROM sys.dm_exec_connections WHERE session_id = @@S ...
- js对象进行浅复制,深拷贝的方法
js对象浅拷贝和深拷贝详解 本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷 ...
- vim出现自动补全的问题
当使用vim编辑文件自动补全文件名称的时候,可能会出现_arguments:451: _vim_files: function definition file not found的错误,这个时候一般都 ...
- apache +PHP多版本 切换的问题
在开发中切换php版本的时候出错 经过2小时的日子排查终于找到是因为切换版本后加载的php7ts.dll模块还是原来版本的,因此保pid file 错误 解决方法 PHPIniDir "H: ...