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

記一次go語言使用time.Duration類型踩過的坑

 更新時(shí)間:2022年01月26日 16:31:28   作者:Go學(xué)堂  
本文主要介紹了記一次go語言使用time.Duration類型踩過的坑,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

01 踩到的坑

先來說說在項(xiàng)目中踩到的使用time.Duration類型的坑。我們的背景是要做一個(gè)延時(shí)任務(wù)。延時(shí)任務(wù)就是指將一個(gè)任務(wù)延遲到一定的時(shí)間后再執(zhí)行,所以就需要根據(jù)延時(shí)時(shí)間計(jì)算出該任務(wù)要執(zhí)行的時(shí)間。我們這里的延時(shí)時(shí)間以毫秒為單位,當(dāng)時(shí)我們定義的是500毫秒。即設(shè)置了一個(gè)全局的變量interval time.Duration。 即interval = 500 * time.Milliseconds。然后就通過以下公式來計(jì)算要

執(zhí)行的時(shí)間了:

可執(zhí)行時(shí)間=當(dāng)前時(shí)間+延遲時(shí)間可執(zhí)行時(shí)間=當(dāng)前時(shí)間 + 延遲時(shí)間可執(zhí)行時(shí)間=當(dāng)前時(shí)間+延遲時(shí)間

由以上公式可得到我們的一個(gè)任務(wù)的可執(zhí)行時(shí)間為 time.Now().UnixMilli() + int64(interval) 。大家看這里有什么問題嗎?
問題在于計(jì)算的結(jié)果值不是在當(dāng)前的毫秒數(shù)上增加了500,而是增加了500000000,多了6個(gè)零。這是為什么呢?

02 time.Duration的真實(shí)面目

我們從源碼中找到答案。我們從time包中看到time.Duration的定義:

// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
type Duration int64

由源碼可知,Duration本質(zhì)上是一個(gè)int64的類型。從注釋可知,代表的是兩個(gè)時(shí)間點(diǎn)之間持續(xù)的納秒數(shù) 。 所以這里有兩點(diǎn)信息 :一是該類型代表的是一段持續(xù)時(shí)間,二是該類型的基本單位是納秒。 這里我先重點(diǎn)關(guān)注基本單位是納秒這點(diǎn)。我們?cè)賮砜磶讉€(gè)常量的定義:

const (
? ? Nanosecond ?Duration = 1
? ? Microsecond ? ? ? ? ?= 1000 * Nanosecond
? ? Millisecond ? ? ? ? ?= 1000 * Microsecond
? ? Second ? ? ? ? ? ? ? = 1000 * Millisecond
? ? Minute ? ? ? ? ? ? ? = 60 * Second
? ? Hour ? ? ? ? ? ? ? ? = 60 * Minute
)

一個(gè)單位的Duration是代表1納秒。 而time.Micorsecond、time.Millisecond、time.Second、time.Minute、time.Hour的單位實(shí)際上都是納秒。也就是說我們使用到的time.Millisecond實(shí)際上是1000000納秒。所以就有了interval=500*time.Millisecond=500 * 1000000 = 500000000,然后在計(jì)算延時(shí)后的執(zhí)行時(shí)間時(shí)兩個(gè)單位不一樣造成計(jì)算出來的值不是預(yù)期的增加500毫秒的結(jié)果。

03 問題解決

知道了time.Duration類型的基本單位是代表納秒之后,我們就可以很好的解決了。就是統(tǒng)一單位。
我們也發(fā)現(xiàn),在time包中對(duì)于time.Duration類型的對(duì)象有轉(zhuǎn)換成秒、毫秒等對(duì)應(yīng)的函數(shù)。如下:

所以我們直接獲取即可:

可執(zhí)行時(shí)間 := time.Now().UnixMilli() + interval.Millisecond()

04 time.Duration編程實(shí)踐

上面是我在編碼時(shí)因?yàn)闆]搞懂time.Duration類型的本質(zhì)含義猜到的一個(gè)坑。那么我們?cè)趯?shí)際編碼時(shí)在定義和持續(xù)時(shí)間有關(guān)的變量時(shí)應(yīng)該使用int類型還是time.Duration類型呢?
我的建議是大家盡量用time.Duration類型。為什么呢?第一個(gè)原因是和標(biāo)準(zhǔn)庫(kù)類型統(tǒng)一,不用做過多的轉(zhuǎn)換。因?yàn)槲覀冇^察可以發(fā)現(xiàn),無論是開源程序,還是go的標(biāo)準(zhǔn)庫(kù),凡是和持續(xù)時(shí)間相關(guān)的變量類型都是使用的time.Duration,這樣類型統(tǒng)一我們來看幾個(gè)例子。

示例一:context.WithTimeout

func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
? ? return WithDeadline(parent, time.Now().Add(timeout))
}

我們看到,context包中的WithTimeout函數(shù)中的timeout的類型是time.Duration。

示例二:time.Sleep

func Sleep(d Duration)

time包中的Sleep函數(shù)的d參數(shù)也是Duration類型。

示例三:time.NewTicker

func NewTicker(d Duration) *Ticker

如果我們自己的程序中相關(guān)變量使用的也是time.Duration類型,那么在調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)時(shí)就不用進(jìn)行類型轉(zhuǎn)化了。

第二個(gè)原因就是該類型在語義上就明確了time.Duration類型值的基本單位是納秒。這樣在函數(shù)調(diào)用過程中就不用進(jìn)行單位換算了。我們看下面以連接redis的示例是如何進(jìn)行類型轉(zhuǎn)換的。

我們?cè)谶B接redis的時(shí)候,一般都會(huì)設(shè)置讀寫超時(shí)時(shí)間以及定義redis的地址,我們有如下配置:

type config struct {
    Addr string
    ReadTimeout int64 //以秒為單位
}

我們使用包github.com/go-redis/redis/v8包來連接redis。我們看到

func NewRedisClient(conf config) *redis.Client {
    opt := redis.Options{
        Addr: conf.Addr,
        ReadTimeout: conf.ReadTimeout * time.Second
    }
    
    client := redis.NewClient(opt)
    
    return client
}

我們知道redis.Options中的ReadTimeout的類型是time.Duration。 那么,如果我們?cè)赾onfig配置文件中定義的int64類型以秒為單位的話,則在NewRedisClient中給redis.Options中的ReadTimeout賦值時(shí),需要做如下轉(zhuǎn)換:

conf.ReadTimeout * time.Second

那如果我們?cè)赾onfig中定義的ReadTimeout的代表的是毫秒的話,那么在NewRedisClient函數(shù)中就需要做如下轉(zhuǎn)換:

conf.ReadTimeout * time.Millisecond

那在config結(jié)構(gòu)體中的ReadTimeout所代表的含義是秒還是毫秒還是其他的由誰來保證呢,只能是人為的進(jìn)行保證。而如果使用time.Duration類型就是由系統(tǒng)類型來保證的,因?yàn)間o的標(biāo)準(zhǔn)庫(kù)定義的該類型就是代表納秒數(shù)。

05 總結(jié)

本文從在實(shí)際編程中遇到的問題出發(fā),了解到time.Duration類型實(shí)際代表的是持續(xù)的納秒數(shù)。同時(shí)又分析了使用time.Duration類型的好處。在項(xiàng)目中,如果遇到和持續(xù)時(shí)間相關(guān)的變量的定義,也建議大家盡量使用time.Duration類型。

到此這篇關(guān)于記一次go語言使用time.Duration類型踩過的坑的文章就介紹到這了,更多相關(guān)go time.Duration內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • golang解析html網(wǎng)頁的方法

    golang解析html網(wǎng)頁的方法

    今天小編就為大家分享一篇golang解析html網(wǎng)頁的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Go 實(shí)現(xiàn)百萬WebSocket連接的方法示例

    Go 實(shí)現(xiàn)百萬WebSocket連接的方法示例

    這篇文章主要介紹了Go 實(shí)現(xiàn)百萬WebSocket連接的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 分析Go語言中CSP并發(fā)模型與Goroutine的基本使用

    分析Go語言中CSP并發(fā)模型與Goroutine的基本使用

    我們都知道并發(fā)是提升資源利用率最基礎(chǔ)的手段,尤其是當(dāng)今大數(shù)據(jù)時(shí)代,流量對(duì)于一家互聯(lián)網(wǎng)企業(yè)的重要性不言而喻。串流顯然是不行的,尤其是對(duì)于web后端這種流量的直接載體。并發(fā)是一定的,問題在于怎么執(zhí)行并發(fā)。常見的并發(fā)方式有三種,分別是多進(jìn)程、多線程和協(xié)程
    2021-06-06
  • 一文帶你讀懂Golang?sync包之sync.Mutex

    一文帶你讀懂Golang?sync包之sync.Mutex

    sync.Mutex可以說是sync包的核心了,?sync.RWMutex,?sync.WaitGroup...都依賴于他,?本章我們將帶你一文讀懂sync.Mutex,快跟隨小編一起學(xué)習(xí)一下吧
    2023-04-04
  • golang中對(duì)

    golang中對(duì)"引用傳遞"的誤解

    這篇文章主要介紹了golang中對(duì)“引用傳遞”的誤解,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • 模塊一 GO語言基礎(chǔ)知識(shí)-庫(kù)源碼文件

    模塊一 GO語言基礎(chǔ)知識(shí)-庫(kù)源碼文件

    這篇文章主要介紹了模塊一 GO語言基礎(chǔ)知識(shí)-庫(kù)源碼文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • golang?slice中常見性能優(yōu)化手段總結(jié)

    golang?slice中常見性能優(yōu)化手段總結(jié)

    這篇文章主要為大家詳細(xì)一些Golang開發(fā)中常用的slice關(guān)聯(lián)的性能優(yōu)化手段,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • golang如何替換換行符

    golang如何替換換行符

    這篇文章主要介紹了golang如何替換換行符問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 解決電腦用GoLand太卡將VsCode定制成Go IDE步驟過程

    解決電腦用GoLand太卡將VsCode定制成Go IDE步驟過程

    這篇文章主要為大家介紹了解決電腦用GoLand太卡,將VsCode定制成Go IDE步驟過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實(shí)踐

    Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實(shí)踐

    這篇文章主要為大家介紹了Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

南召县| 乌拉特后旗| 宣威市| 肇庆市| 和龙市| 察隅县| 都安| 清镇市| 正阳县| 普格县| 浮山县| 清水河县| 二手房| 陇川县| 克山县| 宁津县| 宾阳县| 神木县| 施秉县| 巴塘县| 蓬安县| 山阴县| 格尔木市| 始兴县| 中西区| 东山县| 江阴市| 昭通市| 平昌县| 多伦县| 安图县| 时尚| 黑龙江省| 西青区| 河津市| 北安市| 且末县| 青海省| 海阳市| 兴海县| 韩城市|