Go語言學習-time包

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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時,什麼事情都不會做

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

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

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後 //間隔時間過後,執行傳入的函數

由於f函數不是在Main Line執行的,而是註冊在goroutine Line裡執行的 
所以一旦後悔的話,需要使用Stop命令來停止即將開始的執行,如果已經開始執行就來不及了

houhui := truef := 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.Time的方法(time.Time自己專屬的函數)

Before & After方法

判斷一個時間點是否在另一個時間點的前面(後面),返回true或false

t1:=time.Now()time.Sleep(time.Second)t2:=time.Now()a:=t2.After(t1)     //t2的記錄時間是否在t1記錄時間的**後面**呢,是的話,a就是truefmt.Println(a)       //trueb:=t2.Before(t1)     //t2的記錄時間是否在t1記錄時間的**前面**呢,是的話,b就是truefmt.Println(b)       //false

Sub方法

兩個時間點相減,獲得時間差(Duration)

t1:=time.Now()time.Sleep(time.Second)t2:=time.Now()d:=t2.Sub(t1)     //時間2減去時間1fmt.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點(呵呵)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.