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) 
表示睡多少時間,睡覺時,是阻塞狀態ui

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差很少,意思是多少時間以後,但在取出管道內容前不阻塞spa

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) //返回一個time.C這個管道,1秒(time.Second)後會在此管道中放入
                        //一個時間點(time.Now()),時間點記錄的是放入管道那一刻的時間值
fmt.Println("the 2")
fmt.Println("the 3")
time.Sleep(time.Second*0.5)//這裏是假設這個Println動做執行了半秒鐘
fmt.Println("the 4")
time.Sleep(time.Second*0.5)//這裏是假設這個Println動做執行了半秒鐘
fmt.Println("the 5")
fmt.Println("the 6")
fmt.Println("the 7")
<-tc   //阻塞中,直到取出tc管道里的數據
fmt.Println("the 8")
//【結果】當即打印1和2,花了半秒打印了3和4,而後又當即打印了5678,結束
//這裏的<-tc是當即能得到數據的
//由於早在執行差很少Print 6的時候,管道內已經有數據了
//當gorotine線把數據丟到管道中後,它本身阻塞了(具體請了解goroutine)

上面的說法是錯的,實際上會抱一個錯誤,0.5秒不能這樣表示,而後打印是先打印1,2,3,過了半秒打印4,再過半秒答應5,6,7,8.net

time.After2

AfterFunc函數

time.AfterFunc(time.Duration,func()) 
和After差很少,意思是多少時間以後在goroutine line執行函數unix

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命令來中止即將開始的執行,若是已經開始執行就來不及了code

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一致get

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或falseio

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點(呵呵)

相關文章
相關標籤/搜索