亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go 計時器使用示例全面講解

 更新時間:2023年09月24日 15:10:00   作者:TimLiu  
這篇文章主要為大家介紹了Go 計時器使用示例全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

簡介

定時器是任何編程語言的重要工具,它允許開發(fā)人員在特定時間間隔安排任務(wù)或執(zhí)行代碼。在 Go 中,定時器是通過 time 包實現(xiàn)的,該包提供了一系列功能來創(chuàng)建、啟動、停止和有效處理定時器。我們將探索 Go 中定時器的強大功能,并通過代碼示例演示如何在應(yīng)用程序中使用定時器。

創(chuàng)建計時器

要在 Go 中創(chuàng)建一個定時器,我們可以使用 time.NewTimer() 函數(shù),該函數(shù)將持續(xù)時間作為參數(shù)。下面是一個示例:

func CreateTimer() {
    timer := time.NewTimer(2 * time.Second)
    fmt.Println("Timer created.")
    <-timer.C // 阻塞
    fmt.Println("Timer expired.")
}

在上述代碼片段中,我們使用 time.NewTimer() 創(chuàng)建了一個持續(xù)時間為 2 秒的新定時器。<-timer.C 語句會阻塞執(zhí)行,直到定時器過期。定時器到期后,"Timer expired."(定時器已過期)信息將打印到控制臺。

停止計時器

在某些情況下,您可能想在定時器到期前停止它。為此,您可以使用定時器對象的 Stop() 方法。讓我們修改之前的示例,加入定時器停止功能:

func StopTimer() {
    timer := time.NewTimer(2 * time.Second)
    fmt.Println("Timer created.")
    go func() {
        <-timer.C
        fmt.Println("Timer expired.")
    }()
    time.Sleep(1 * time.Second)
    stopped := timer.Stop()
    if stopped {
        fmt.Println("Timer stopped.")
    } else {
        fmt.Println("Timer has already expired.")
    }
}

在更新后的代碼中,我們創(chuàng)建了一個 goroutine 來處理定時器過期,這樣就可以在定時器過期前停止它。我們使用 time.Sleep() 函數(shù)來模擬在嘗試停止計時器之前正在進行的一些工作。

最后,我們調(diào)用 timer.Stop() 停止定時器。如果定時器已過期,timer.Stop() 返回 false,并打印 "定時器已過期"。否則,我們將打印 "定時器已停止"。

重置計時器

Go 還提供了重置活動定時器的方法。通過 Reset() 方法,您可以更改活動定時器的持續(xù)時間,重新開始倒計時。下面是一個示例:

func ResetTimer() {
    timer := time.NewTimer(10 * time.Second)
    fmt.Printf("time: %d, Timer created.\n", time.Now().Unix())
    time.Sleep(2 * time.Second)
    reset := timer.Reset(3 * time.Second)
    if reset {
        fmt.Printf("time: %d, Timer reset.\n", time.Now().Unix())
    } else {
        fmt.Printf("time: %d, Timer has already expired.\n", time.Now().Unix())
    }
    <-timer.C // 阻塞
    fmt.Printf("time: %d, Timer expired again.\n", time.Now().Unix())
}

輸出為:

time: 1695183503, Timer created.
time: 1695183505, Timer reset.
time: 1695183508, Timer expired again.

在上述代碼中,我們創(chuàng)建了一個持續(xù)時間為 10 秒的計時器。使用 time.Sleep() 等待 2 秒后,我們調(diào)用 timer.Reset(),新的持續(xù)時間為 3 秒。如果定時器尚未過期,則重置操作成功,我們將打印 "定時器重置"。否則,進入到 <-timer.C 阻塞階段,然后打印 我們將打印 "Timer expired again."。

重置定時器與停止定時器

了解重置定時器和使用 Stop() 停止定時器之間的區(qū)別非常重要。

func CompareResetAndStop() {
    timer := time.NewTimer(5 * time.Second)
    fmt.Printf("time: %d, Timer created.\n", time.Now().Unix())
    go func() {
        <-timer.C
        fmt.Printf("time: %d, Timer expired.\n", time.Now().Unix())
    }()
    time.Sleep(2 * time.Second)
    timer.Reset(3 * time.Second)
    fmt.Printf("time: %d, Timer reset.\n", time.Now().Unix())
    time.Sleep(2 * time.Second)
    timer.Stop()
    fmt.Printf("time: %d, Timer stopped.\n", time.Now().Unix())
}

輸出為:

time: 1695183802, Timer created.
time: 1695183804, Timer reset.
time: 1695183806, Timer stopped.

在本例中,我們創(chuàng)建了一個持續(xù)時間為 5 秒的計時器。2 秒后,我們使用 timer.Reset() 將計時器重置為 3 秒。之后,再過 2 秒,我們使用 timer.Stop() 停止計時器。重置定時器會改變其持續(xù)時間并重新開始倒計時,而停止定時器則會立即停止執(zhí)行,無論剩余持續(xù)時間多長。

帶 Ticker 的計時器

Go 提供了一種 Ticker 類型,它是一種專門的定時器,可在指定的時間間隔內(nèi)重復(fù)觸發(fā)。定時器可用于定期執(zhí)行任務(wù)。

func Tick() {
    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()
    go func() {
        for range ticker.C {
            fmt.Printf("time: %d, Ticker ticked!\n", time.Now().Unix())
        }
    }()
    time.Sleep(5 * time.Second)
}

在本例中,我們使用 time.NewTicker() 創(chuàng)建了一個持續(xù)時間為 1 秒的 Ticker。然后,我們啟動一個 goroutine,從 ticker.C channel 接收值,每當(dāng)?shù)未鹇曧懫饡r,goroutine 就會發(fā)出一個值。在 goroutine 中,每次接收到一個 tick 時,我們都會打印 "Ticker ticked!"。調(diào)用 time.Sleep() 可以讓滴答滴答運行 5 秒鐘,然后退出程序。

使用 Select 的超時

Go 的 select 語句允許在多個通道上執(zhí)行非阻塞操作。這可以用來使用計時器實現(xiàn)超時。

func TimeOut() {
    ch := make(chan string)
    go func() {
        time.Sleep(2 * time.Second)
        ch <- "Operation completed."
    }()
    select {
    case msg := <-ch:
        fmt.Println(msg)
    case <-time.After(1 * time.Second):
        fmt.Println("Timeout reached.")
    }
}

在本例中,我們創(chuàng)建了一個 channel ch,并啟動一個 goroutine 來模擬耗時 2 秒的操作。我們使用 select 語句從 ch 接收信息,或使用 time.After() 等待超時。如果操作在 1 秒內(nèi)完成,則打印消息。否則,將執(zhí)行超時情況,并打印 "Timeout reached."。

以上就是Go 計時器使用示例全面講解的詳細內(nèi)容,更多關(guān)于Go 計時器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言中如何進行包管理

    Go語言中如何進行包管理

    在Go語言中,包(package)是函數(shù)和數(shù)據(jù)的集合,用于組織代碼,實現(xiàn)模塊化開發(fā),本文將結(jié)合實際案例,詳細講解Go語言包管理的用法,有需要的可以參考下
    2024-10-10
  • Go工具鏈之go tool fix用法詳解

    Go工具鏈之go tool fix用法詳解

    go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正為新版本的代碼,本文將簡單介紹一下go tool fix的使用方法,感興趣的小伙伴可以參考閱讀下
    2023-07-07
  • Golang學(xué)習(xí)筆記(四):array、slice、map

    Golang學(xué)習(xí)筆記(四):array、slice、map

    這篇文章主要介紹了Golang學(xué)習(xí)筆記(四):array、slice、map,本文分別講解了這3個類型的聲明&賦值、元素訪問、其它操作,需要的朋友可以參考下
    2015-05-05
  • Golang使用DuckDB查詢Parquet文件數(shù)據(jù)的操作代碼

    Golang使用DuckDB查詢Parquet文件數(shù)據(jù)的操作代碼

    本文介紹DuckDB查詢Parquet文件的典型應(yīng)用場景,掌握DuckDB會讓你的產(chǎn)品分析能力更強,相反系統(tǒng)運營成本相對較低,為了示例完整,我也提供了如何使用Python導(dǎo)出MongoDB數(shù)據(jù),需要的朋友可以參考下
    2025-01-01
  • 淺談Go連接池的設(shè)計與實現(xiàn)

    淺談Go連接池的設(shè)計與實現(xiàn)

    本文主要介紹了淺談Go連接池的設(shè)計與實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go并發(fā)調(diào)用的超時處理的方法

    Go并發(fā)調(diào)用的超時處理的方法

    這篇文章主要介紹了Go并發(fā)調(diào)用的超時處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 解決golang讀取http的body時遇到的坑

    解決golang讀取http的body時遇到的坑

    這篇文章主要介紹了解決golang讀取http的body時遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言操作mysql數(shù)據(jù)庫簡單例子

    Go語言操作mysql數(shù)據(jù)庫簡單例子

    這篇文章主要介紹了Go語言操作mysql數(shù)據(jù)庫簡單例子,本文包含插入數(shù)據(jù)和查詢代碼實例,需要的朋友可以參考下
    2014-10-10
  • Go語言實現(xiàn)控制臺輸入&生成隨機數(shù)詳解

    Go語言實現(xiàn)控制臺輸入&生成隨機數(shù)詳解

    這篇文章主要介紹了Go語言如何實現(xiàn)控制臺輸入&生成隨機數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • go中string、int、float相互轉(zhuǎn)換的實現(xiàn)示例

    go中string、int、float相互轉(zhuǎn)換的實現(xiàn)示例

    本文主要介紹了go中string、int、float相互轉(zhuǎn)換的實現(xiàn)示例,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論