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

淺析go中Ticker,Timer和Tick的用法與區(qū)別

 更新時(shí)間:2023年10月22日 08:04:22   作者:nil  
在go面試的時(shí)候,面試官經(jīng)常會(huì)問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時(shí)控制的時(shí)候用的比較多,今天就跟隨小編一起來詳細(xì)學(xué)一下這幾個(gè)的區(qū)別吧

寫在前面

在go面試的時(shí)候,面試官經(jīng)常會(huì)問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時(shí)控制的時(shí)候用的比較多。今天就來詳細(xì)學(xué)一下這幾個(gè)的區(qū)別

Ticker

Ticker是周期性定時(shí)器,即周期性的觸發(fā)一個(gè)事件,它會(huì)以一個(gè)間隔(interval)往channel發(fā)送一個(gè)事件(當(dāng)前時(shí)間),而channel的接收者可以以固定的時(shí)間間隔從channel中讀取事件。通過Ticker本身提供的管道將事件傳遞出去

示例

func main() {
    t1 := time.NewTicker(3 * time.Second)
    defer t1.Stop()
    for {
       select {
       case <-t1.C:
          fmt.Printf("%s\n", time.Now())
       }
    }
}

結(jié)果

2023-10-21 18:53:30.629901 +0800 CST m=+3.001061072
2023-10-21 18:53:33.629444 +0800 CST m=+6.000526969
2023-10-21 18:53:36.629429 +0800 CST m=+9.000436237

通過NewTicker創(chuàng)建一個(gè)Ticker,然后通過通過for+select實(shí)現(xiàn)定時(shí)執(zhí)行。記住Ticker一定要調(diào)用Stop方法,關(guān)閉chan,否則容易造成內(nèi)存泄露。Ticker最常用的2個(gè)函數(shù)就是NewTickerStop。

Ticker主要用于定期循環(huán)執(zhí)行某一個(gè)操作。

Timer

用于執(zhí)行一次性任務(wù)。在指定時(shí)間間隔之后再下chan發(fā)送一個(gè)事件(當(dāng)前時(shí)間)

func main() {
    t1 := time.NewTimer(3 * time.Second)
    defer t1.Stop()
    for {
       t1.Reset(3 * time.Second)
       select {
       case <-t1.C:
          fmt.Printf("%s\n", time.Now())
       }
    }
}

用Timer也能實(shí)現(xiàn)Ticker循環(huán)執(zhí)行的功能,但是每次必須調(diào)用Reset方法,否則會(huì)死鎖,因?yàn)門imer只會(huì)執(zhí)行一次。不過Timer一般不用于循環(huán)執(zhí)行,它用于超時(shí)控制,比如調(diào)用某個(gè)rpc,如果超過3s則終止調(diào)用。

示例

func main() {
    t1 := time.NewTimer(3 * time.Second)
    defer t1.Stop()

    ctx, cancel := mockRPC()
    select {
    case <-ctx.Done():
       fmt.Printf("rpc end\n")
       break
    case <-t1.C:
       // t1時(shí)間到了,rpc還沒執(zhí)行完,則執(zhí)行cancel()并退出
       fmt.Printf("%s\n", time.Now())
       cancel()
    }
}

// mockRPC. 異步執(zhí)行5s鐘,如果已經(jīng)結(jié)束了則停止執(zhí)行
func mockRPC() (context.Context, context.CancelFunc) {
    ctx, cancel := context.WithCancel(context.Background())
    go func() {
       for i := 0; i < 5; i++ {
          select {
          case <-ctx.Done():
             break
          default:
             fmt.Printf("%d\n", i)
             time.Sleep(time.Second)
          }
       }
    }()

    return ctx, cancel
}

結(jié)果

0
1
2
2023-10-21 19:18:53.565153 +0800 CST m=+3.000558307

Tick

Tick其實(shí)最簡(jiǎn)單,直接看它的源代碼

func Tick(d Duration) <-chan Time {
    if d <= 0 {
       return nil
    }
    return NewTicker(d).C
}

發(fā)現(xiàn)Tick其實(shí)就是一個(gè)Ticker的C,所以使用起來更方便

func main() {
    t1 := time.Tick(3 * time.Second)
    for {
       select {
       case <-t1:
          fmt.Printf("%s\n", time.Now())
       }
    }
}

但是有一個(gè)問題,由于Tick()函數(shù)沒有返回Ticker,我們無法關(guān)閉它,所以這個(gè)t1對(duì)應(yīng)的Ticker用于無法關(guān)閉,會(huì)造成內(nèi)存泄露。一般不推薦用Tick,直接使用Ticker就好了。應(yīng)該只能在程序結(jié)束的時(shí)候會(huì)回收內(nèi)存,但是Tick和Ticker區(qū)別這么小,不知道為什么要定義Tick()這個(gè)函數(shù)。

總結(jié)

  • Ticker是一個(gè)定時(shí)器。
  • Timer是一個(gè)延遲執(zhí)行器,也可以通過Reset()來實(shí)現(xiàn)定時(shí)器。
  • Tick()是一個(gè)函數(shù),返回Ticker的chan,不推薦使用。

到此這篇關(guān)于淺析go中Ticker,Timer和Tick的用法與區(qū)別的文章就介紹到這了,更多相關(guān)go Ticker Timer Tick內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?編程復(fù)雜數(shù)據(jù)類型?Map

    Go?編程復(fù)雜數(shù)據(jù)類型?Map

    這篇文章主要介紹了Go編程復(fù)雜數(shù)據(jù)類型Map,Go中的Map是一組無需的K-V類型的數(shù)據(jù),與Python中的字典Dict和Java中的HashMap結(jié)構(gòu)類似。未被初始化的Map為nil
    2022-08-08
  • Go語言fmt包的具體使用

    Go語言fmt包的具體使用

    Go語言的fmt包提供了豐富多樣的輸入輸出功能,無論是格式化輸出、文件寫入,還是從各種輸入源讀取數(shù)據(jù),都能輕松應(yīng)對(duì),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-07-07
  • Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識(shí)鞏固

    Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識(shí)鞏固

    這篇文章主要為大家介紹了Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識(shí)鞏固,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • jenkins構(gòu)建go及java項(xiàng)目的方法

    jenkins構(gòu)建go及java項(xiàng)目的方法

    這篇文章主要介紹了jenkins構(gòu)建go及java項(xiàng)目,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值了,需要的朋友可以參考下
    2021-04-04
  • Golang變量直接初始化的方法詳解

    Golang變量直接初始化的方法詳解

    在 Go 語言中,我們常用的數(shù)據(jù)結(jié)構(gòu)有在Go語言中,你可以初始化不同的數(shù)據(jù)結(jié)構(gòu),例如數(shù)組、切片、結(jié)構(gòu)體、指針、map等,本文將給大家介紹一下Golang變量直接初始化的方法,需要的朋友可以參考下
    2023-08-08
  • 基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解

    基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解

    這篇文章主要為大家介紹了基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Golang中g(shù)oto跳轉(zhuǎn)語句的實(shí)現(xiàn)

    Golang中g(shù)oto跳轉(zhuǎn)語句的實(shí)現(xiàn)

    本文主要介紹了Golang中g(shù)oto跳轉(zhuǎn)語句的實(shí)現(xiàn),包括標(biāo)簽的定義、跳轉(zhuǎn)語句的使用、作用域限制、避免濫用的原因以及歷史遺留代碼中的使用情況,感興趣的可以了解一下
    2025-03-03
  • go語言map字典刪除操作的方法

    go語言map字典刪除操作的方法

    這篇文章主要介紹了go語言map字典刪除操作的方法,實(shí)例分析了map字典操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go如何實(shí)現(xiàn)Websocket服務(wù)以及代理

    Go如何實(shí)現(xiàn)Websocket服務(wù)以及代理

    這篇文章主要介紹了Go如何實(shí)現(xiàn)Websocket服務(wù)以及代理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 一篇文章帶你搞懂Go語言標(biāo)準(zhǔn)庫(kù)Time

    一篇文章帶你搞懂Go語言標(biāo)準(zhǔn)庫(kù)Time

    在我們開發(fā)的過程中,每個(gè)項(xiàng)目都需要時(shí)間這一類的函數(shù),此時(shí)對(duì)time這個(gè)包的研究深度就顯得尤為重要,這篇文章主要給大家介紹了關(guān)于如何通過一篇文章帶你搞懂Go語言標(biāo)準(zhǔn)庫(kù)Time的相關(guān)資料,需要的朋友可以參考下
    2022-10-10

最新評(píng)論

东港市| 博湖县| 宁都县| 永新县| 长武县| 福泉市| 平和县| 闻喜县| 太原市| 中西区| 汽车| 绩溪县| 长汀县| 黄平县| 定日县| 远安县| 开鲁县| 安溪县| 武穴市| 锡林浩特市| 汪清县| 墨脱县| 兴海县| 青阳县| 安福县| 曲阜市| 五莲县| 安多县| 莲花县| 安宁市| 寿宁县| 盖州市| 东乌珠穆沁旗| 鲜城| 华容县| 清徐县| 谢通门县| 石河子市| 明水县| 铁岭市| 东莞市|