互連網二十多年,已到十字路口。區塊鏈出現前的互連網被稱為古典互連網,而應用區塊鏈技術的互連網才進入了後互連網時代。作為一項新興的技術,區塊鏈無疑正處於風口浪尖之上,其發展前景於普通福士而言也終將是利好。但目前由於區塊鏈技術處於發展早期階段,存在技術成熟度等級、落地應用情境有限等問題,兄弟連教育建議使用者在選擇專業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
關注兄弟連區塊鏈技術公眾號領取更多技術乾貨哦!!!