最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你理解Golang中的Time結(jié)構(gòu)

 更新時間:2023年09月19日 14:09:05   作者:Golang私房菜  
根據(jù)golang的time包的文檔可以知道,golang的time結(jié)構(gòu)中存儲了兩種時鐘,一種是Wall?Clocks,一種是Monotonic?Clocks,下面我們就來簡單了解一下這兩種結(jié)構(gòu)吧

在golang中創(chuàng)建并打印一個時間對象,會看到如下輸出

2018-10-26 14:15:50.306558969 +0800 CST m=+0.000401093

前面表示的意義好理解,分別是年月日和時間時區(qū),最后的m=+xxxx這部分代表什么呢?

Monotonic Clocks 和 Wall Clocks

根據(jù)golang的time包的文檔可以知道,golang的time結(jié)構(gòu)中存儲了兩種時鐘,一種是Wall Clocks,一種是Monotonic Clocks。

Wall Clocks,顧名思義,表示墻上掛的鐘,在這里表示我們平時理解的時間,存儲的形式是自 1970 年 1 月 1 日 0 時 0 分 0 秒以來的時間戳,當(dāng)系統(tǒng)和授時服務(wù)器進(jìn)行校準(zhǔn)時間時間操作時,有可能造成這一秒是2018-1-1 00:00:00,而下一秒變成了2017-12-31 23:59:59的情況。Monotonic Clocks,意思是單調(diào)時間的,所謂單調(diào),就是只會不停的往前增長,不受校時操作的影響,這個時間是自進(jìn)程啟動以來的秒數(shù)。

如果每隔一秒生成一個Time并打印出來,就會看到如下輸出。

2018-10-26 14:15:50.306558969 +0800 CST m=+0.000401093
2018-10-26 14:15:51.310559881 +0800 CST m=+1.004425285
2018-10-26 14:15:52.311822486 +0800 CST m=+2.005711106
2018-10-26 14:15:53.314599457 +0800 CST m=+3.008511329
2018-10-26 14:15:54.31882248 +0800 CST m=+4.012757636
2018-10-26 14:15:55.320059921 +0800 CST m=+5.014018292
2018-10-26 14:15:56.323814998 +0800 CST m=+6.017796644
2018-10-26 14:15:57.324858749 +0800 CST m=+7.018863606
2018-10-26 14:15:58.325164174 +0800 CST m=+8.019192224
2018-10-26 14:15:59.329058535 +0800 CST m=+9.023109863
2018-10-26 14:16:00.329591268 +0800 CST m=+10.023665796

可以看到m=+后面所顯示的數(shù)字,就是文檔中所說的Monotonic Clocks。

Time結(jié)構(gòu)

那么Monotonic Clock和Wall Clock在Time中是怎么存儲的呢?來看一下Time結(jié)構(gòu)體。

type Time struct {
    wall uint64
    ext  int64
    loc *Location
}

Time結(jié)構(gòu)體中由三部分組成,loc比較明了,表示時區(qū),wall和ext所存儲的信息規(guī)則相對復(fù)雜,根據(jù)文檔的介紹總結(jié)成了下圖:

golang中的Time結(jié)構(gòu),不像很多語言保存Unix時間戳(也就是最早只能表示到1970年1月1日),而是至少可以安全的表示1885年以來的時間。

t, _ := time.Parse(time.RFC3339, "1890-01-02T15:04:05Z")
fmt.Println(t) // 1890-01-02 15:04:05 +0000 UTC

實(shí)踐中需要注意的問題

既然Time結(jié)構(gòu)所表示的時間,有可能有Monotonic Clock也可能沒有,那么在使用中就有可能遇到一些問題,例如下面這種情況。

now := time.Now()
encodeNow, _ := json.Marshal(now)
decodeNow := time.Time{}
json.Unmarshal(encodeNow, &decodeNow)
fmt.Println(now)  // 2018-10-26 16:04:55.230121766 +0800 CST m=+0.000520419
fmt.Println(decodeNow)  // 2018-10-26 16:04:55.230121766 +0800 CST

可以看到,經(jīng)過JSON轉(zhuǎn)碼之后,Time結(jié)構(gòu)體會被表示成不帶Monotonic Clock的字符串,丟失了Monotonic Clock信息,而將字符串轉(zhuǎn)碼回Time結(jié)構(gòu)時,自然也就和轉(zhuǎn)碼之前的不一樣了。同樣的情況,也發(fā)生在數(shù)據(jù)庫存儲中,存儲到數(shù)據(jù)庫里的Time結(jié)構(gòu)和從數(shù)據(jù)庫取出來的也是不一樣的。

當(dāng)調(diào)用Equal比較兩個Time時,只有兩個Time都含有Monotonic Clock時,才會根據(jù)Monotonic Clock比較大小,其他情況只比較Wall Clock部分。

timeA := time.Now()
timeB := time.Unix(0, timeA.UnixNano())
fmt.Println(timeA)  // 2018-10-26 16:37:02.216165074 +0800 CST m=+0.000363156
fmt.Println(timeB)  // 2018-10-26 16:37:02.216165074 +0800 CST
r := timeA.Equal(timeB)
fmt.Println(r)  // true

上面兩個時間的Wall Clock部分相同,一個有Monotonic Clock一個沒有,但是比較的結(jié)果是兩個時間是相同的。

timeA := time.Now()
timeB := time.Unix(timeA.Unix(), 0)
fmt.Println(timeA)  // 2018-10-26 16:38:25.653953438 +0800 CST m=+0.000364851
fmt.Println(timeB)  // 2018-10-26 16:38:25 +0800 CST
r := timeA.Equal(timeB)
fmt.Println(r)  // false

需要注意的是Wall Clock并不是秒之前的部分,Wall Clock本身也可以精確到納秒級別,所以一個精確到納秒的時間和一個精確到秒的時間也是不同的。

對于Time中的Monotonic Clock,我們可以使用time.Round(0)方法將其消除掉,以實(shí)現(xiàn)和其他語言一致的行為。

timeA := time.Now()
timeB := timeA.Round(0)
fmt.Println(timeA)  // 2018-10-26 16:43:03.799263739 +0800 CST m=+0.000357758
fmt.Println(timeB)  // 2018-10-26 16:43:03.799263739 +0800 CST

到此這篇關(guān)于一文帶你理解Golang中的Time結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)Go Time結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go?micro微服務(wù)proto開發(fā)安裝及使用規(guī)則

    go?micro微服務(wù)proto開發(fā)安裝及使用規(guī)則

    這篇文章主要為大家介紹了go?micro微服務(wù)proto開發(fā)中安裝Protobuf及基本規(guī)范字段的規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • GO語言zap日志庫理解和使用方法示例

    GO語言zap日志庫理解和使用方法示例

    Zap是一個高性能、結(jié)構(gòu)化日志庫,專為Go語言設(shè)計,它由Uber開源,并且在Go社區(qū)中非常受歡迎,這篇文章主要介紹了GO語言zap日志庫理解和使用方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • 分享6個Go處理字符串的技巧小結(jié)

    分享6個Go處理字符串的技巧小結(jié)

    這篇文章主要介紹了分享6個Go處理字符串的技巧小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Golang語言如何避免空指針引發(fā)的panic詳解

    Golang語言如何避免空指針引發(fā)的panic詳解

    簡單地說go語言的指針類型和C/C++的指針類型用法是一樣的,除了出去安全性的考慮,go語言增加了一些限制,這篇文章主要給大家介紹了關(guān)于Golang語言如何避免空指針引發(fā)panic的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Golang中使用不定數(shù)量空格分割字符串的方法

    Golang中使用不定數(shù)量空格分割字符串的方法

    有這樣一個使用空格分割字符串的場景,字符串中被分割的子串之間的空格數(shù)量不確定,有一個兩個或者多個空格,這種場景下,使用最容易想到的strings.Split函數(shù)就做不到了,本文接下來就介紹幾種行之有效的方法,需要的朋友可以參考下
    2023-07-07
  • 基于Go和Gin的環(huán)境配置方法

    基于Go和Gin的環(huán)境配置方法

    今天小編就為大家分享一篇基于Go和Gin的環(huán)境配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Go語言操作Excel利器之excelize類庫詳解

    Go語言操作Excel利器之excelize類庫詳解

    Excelize是Go語言編寫的用于操作Office Excel文檔基礎(chǔ)庫,基于ECMA-376,ISO/IEC 29500國際標(biāo)準(zhǔn),可以使用它來讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語言操作Excel利器之excelize類庫的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Go調(diào)用鏈可視化工具使用實(shí)例探究

    Go調(diào)用鏈可視化工具使用實(shí)例探究

    本文介紹一款工具?go-callvis,它能夠?qū)?Go?代碼的調(diào)用關(guān)系可視化出來,并提供了可交互式的?web?服務(wù),在接手他人代碼或調(diào)研一些開源項(xiàng)目時,如果能夠理清其中的代碼調(diào)用鏈路,這將加速我們對實(shí)現(xiàn)的理解
    2024-01-01
  • gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)

    gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)

    這篇文章主要為大家介紹了gin框架Context?Get?Query?Param函數(shù)獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Go語言中處理錯誤的技巧分享

    Go語言中處理錯誤的技巧分享

    編寫 Go 語言程序時,有效地處理錯誤是至關(guān)重要的,Go 語言提供了一些強(qiáng)大的工具和模式來處理錯誤,本文將介紹這些方法,以便編寫健壯的 Go 代碼,更好地處理錯誤,需要的朋友可以參考下
    2023-09-09

最新評論

汤阴县| 马公市| 健康| 吴忠市| 岑溪市| 农安县| 永仁县| 南汇区| 凯里市| 靖远县| 古丈县| 望江县| 剑阁县| 皮山县| 长垣县| 香河县| 邓州市| 连平县| 屯昌县| 宣恩县| 安福县| 灵山县| 遂川县| 高尔夫| 延安市| 黎平县| 蛟河市| 垣曲县| 甘孜| 山阴县| 于田县| 石台县| 泾阳县| 平泉县| 清新县| 定西市| 资溪县| 塔城市| 法库县| 淳安县| 乐平市|