兄弟連區塊鏈技術培訓分享Go語言之時間編程

來源:互聯網
上載者:User

  互連網二十多年,已到十字路口。區塊鏈出現前的互連網被稱為古典互連網,而應用區塊鏈技術的互連網才進入了後互連網時代。作為一項新興的技術,區塊鏈無疑正處於風口浪尖之上,其發展前景於普通福士而言也終將是利好。但目前由於區塊鏈技術處於發展早期階段,存在技術成熟度等級、落地應用情境有限等問題,兄弟連教育建議使用者在選擇專業Go語言+區塊鏈培訓機構前應進行仔細考量與辨別。


編程離不開時間,時間管理,嚴格的說分成兩塊,一個是當前的時刻,對應的是一個點,還有是一段時間間隔,本文簡單的講講go的時間相關的編程,比較簡單。


golang對時間的支援,是package time做的事兒,裡面有好多的函數。

熟悉Linux下C編程的就是time函數的傳回值:    

    #include


    time_t now = time(NULL);

golang中一個很重要的表徵時間的資料類型是Time,基本就是三個成員變數 sec ,nsec,Location,詳細意思可以參看注釋。

type Time struct {

           // sec gives the number of seconds elapsed since

            // January 1, year 1 00:00:00 UTC.

            sec int64


            // nsec specifies a non-negative nanosecond

            // offset within the second named by Seconds.

            // It must be in the range [0, 999999999].

            nsec int32


            // loc specifies the Location that should be used to

            // determine the minute, hour, month, day, and year

            // that correspond to this Time.

            // Only the zero Time has a nil Location.

            // In that case it is interpreted to mean UTC.

            loc *Location

        }

OK,如何取到UNIX epoch time.

now := time.Now()


用time package中Now()函數擷取到當前的時間資訊,Now()函數非常的重要,他是後面一切轉換的起始點。從Now()我們擷取到了Time,從Time類型我們從容的擷取到UNIX epoch time ,自然擷取到year ,month ,day,weekday, hour,minute,second,nanosecond.

擷取UNIX epoch time:

 var epoch_seconds int64 = now.Unix()

擷取Year

func (t Time) Year() int


cur_year := now.Year()

擷取Month

func (t Time) Month() Month


cur_month := now.Month()


if cur_month == time.November {

    ...

}

Month是int類型,fmt.Printf("%v") 或者fmt.Println可以列印出November來,同時Month type有String()函數,輸出“November”這樣的字串

const (

        January Month = 1 + iota

        February

        March

        April

        May

        June

        July

        August

        September

        October

        November

        December

)

year mon day,這些都可以在Date函數中一併返回:

func (t Time) Date() (year int, month Month, day int)


year,mon,day = now.Date()

擷取Hour

func (t Time) Hour() int

  cur_hour := now.Hour()


Minute可以通過Minute()返回,second可以通過Second()返回。

time還提供了Clock()的同時返回 hour,minute,second = now.Clock().

golang的版本是:  

package main


import "fmt"

import "time"


func main(){


    now := time.Now()

    year,mon,day := now.UTC().Date()

    hour,min,sec := now.UTC().Clock()

    zone,_ := now.UTC().Zone()

    fmt.Printf("UTC time is %d-%d-%d %02d:%02d:%02d %s\n",

                year,mon,day,hour,min,sec,zone)


    year,mon,day = now.Date()

    hour,min,sec = now.Clock()

    zone,_ = now.Zone()

    fmt.Printf("local time is %d-%d-%d %02d:%02d:%02d %s\n",

     year,mon,day,hour,min,sec,zone)

}


go版本的輸出

---------------------

UTC   time is 2013-11-22 15:51:22 UTC

local time is 2013-11-22 23:51:22 CST

-------------------------------------------------------------------------------------------------------------------------------------------------------------

我們另一個關心的話題,是時間間隔,比如我們profile一個以非常耗時的function,我們會在函數開始前記下時刻值,函數結束後,再次記錄下時刻值,然後兩者的差值,就是函數已耗用時間。

這表明Time是可以相減的,

start_time := time.Now()

expensive_function

end_time :=time.Now()


var duration Duration = end_time.Sub(start_time)

Duration是一種資料類型,其實是個int64類型,表徵的是兩個時刻之間的納秒數。

type Duration int64


const (

        Nanosecond Duration = 1

        Microsecond = 1000 * Nanosecond

        Millisecond = 1000 * Microsecond

        Second = 1000 * Millisecond

        Minute = 60 * Second

        Hour = 60 * Minute

)

Duration類型有Minutes()/Second()/Nanoseconds(), 將duration折算成分鐘/秒/納秒。    

    now := time.Now()

    time.Sleep(3*time.Second);

    end_time := time.Now()


    var dur_time time.Duration = end_time.Sub(now)

    var elapsed_min float64 = dur_time.Minutes()

    var elapsed_sec float64 = dur_time.Seconds()

    var elapsed_nano int64 = dur_time.Nanoseconds()

    fmt.Printf("elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n",

                elapsed_min,elapsed_sec,elapsed_nano)

輸出如下:

elasped 0.050005 minutes or

elapsed 3.000292 seconds or

elapsed 3000292435 nanoseconds

------------------------------------------------------------------------------------------------------------------------------------------------

第二部分描述Duration明顯用到了Sleep()函數,這個函數是以納秒為單位的,相當於C語言中的nanosleep()

#include

nanosleep(): _POSIX_C_SOURCE >= 199309L


int nanosleep(const struct timespec *req, struct timespec *rem);


  #include


  unsigned int sleep(unsigned int seconds);


Go中的time.Sleep一律是以納秒為單位的,當然本質是Duration類型:

如果sleep 3秒中需要寫成:

time.Sleep(3000000000)

這太不方便了,所以,Golang可以寫成

time.Sleep(3*time.Second);

高能預警,兄弟連教育區塊鏈直播課程8月持續火爆來襲!

原價1188元的12節區塊鏈進階課程,現僅需1元!

還可免費領取《Go語言基礎實戰項目開發》與《Go語言進階實戰項目開發》教材兩本!!限時限量!!先到先得!!

http://www.ydma.cn/open/course/24 

關注兄弟連區塊鏈技術公眾號領取更多技術乾貨哦!!! 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.