欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?語言入門之Go?計時器介紹

 更新時間:2022年05月04日 14:11:22   作者:宇宙之一粟  
這篇文章主要介紹了Go?語言入門之Go?計時器,文章基于GO語言的相關(guān)資料展開對其中計時器的詳細內(nèi)容。具有一定的參考價值,需要的小伙伴可以參考一下

引言

一般來說,很多時候我們面臨這樣一種情況,即我們需要運行時間記錄器,它不斷向我們顯示當(dāng)前時間或在給定的時間間隔內(nèi)保持執(zhí)行一定的代碼和平,在這種情況下,我們應(yīng)該使用 ??Ticker???,使用這個我們需要使用 go 語言的 ??time??? 包,我們有一個名為 ??NewTicker()??? 的方法,它允許我們停止和啟動時間代碼,我們需要通過傳遞 ??chan??? 和 ??bool?? 作為將使用的參數(shù)來創(chuàng)建一個代碼通道檢查它是否打開,如果通道打開意味著計時器將繼續(xù)。

Go 的計時器

Go 提供了非常簡單的語法來實現(xiàn)一個計時器,定時器的結(jié)構(gòu)體定義:

type Ticker struct {
C <-chan Time // 拋出來的channel,給上層系統(tǒng)使用,實現(xiàn)計時
r runtimeTimer // 給系統(tǒng)管理使用的定時器,系統(tǒng)通過該字段確定定時器是否到時,如果到時,調(diào)用對應(yīng)的函數(shù)向C中推送當(dāng)前時間。
}

Ticker對外僅暴露一個 channel,指定的時間到來時就往該 channel 中寫入系統(tǒng)時間,也即一個事件。

Ticker 的使用方式也很簡單,代碼如下:

import time
TimeTicker := time.NewTicker(1 * time.Second)
TimeTicker.Stop()
  • ??time??? : 如果想要使用??time?? 中的計時器,那么需要將其導(dǎo)入代碼中
  • ??NewTicker()??? 函數(shù):這個很好理解,新建一個計時器,然后該計時器以時間表達式作為參數(shù),比如一秒??1*time.Second??? ,而不是直接傳入??1??? ,也可以傳入其他時間方式,比如??2*time.Millisecond??
  • 最后,我們可以使用時間表達式調(diào)用由??NewTicker??? 函數(shù)創(chuàng)建的變量上的任何活動。例如,在上面的語法中,我們使用了??TimeTicker.Stop()??? 來停止時間計時器。我們可以在特定條件下使用它,比如定義倒數(shù) 10 秒的計時器,就可以檢查時間是否滿足 10 秒,一旦 10 秒發(fā)生,我們可以調(diào)用??TimeTicker.stop()??。

我們可以每隔一秒輸出一個結(jié)果,比如實現(xiàn)一個倒數(shù) 10 個數(shù)的功能:

package main
import (
"fmt"
"time"
)
func main() {
TimeTicker := time.NewTicker(1 * time.Second)
i := 10
for {
<-TimeTicker.C
fmt.Println("i = ", i)
i--
if i == 0 {
TimeTicker.Stop()
break
}
}
}

然后執(zhí)行該程序:

$ go run main.go
i = 10
i = 9
i = 8
i = 7
i = 6
i = 5
i = 4
i = 3
i = 2
i = 1

Ticker 計時器是如何工作的?

??NewTicker???創(chuàng)建的計時器與??NewTimer???創(chuàng)建的計時器持有的時間??channel???一樣都是帶一個緩存的??channel???,每次觸發(fā)后執(zhí)行的函數(shù)也是??sendTime???,這樣即保證了無論有誤接收方??Ticker??觸發(fā)時間事件時都不會阻塞:

func NewTicker(d Duration) *Ticker {
if d <= 0 {
panic(errors.New("non-positive interval for NewTicker"))
}
// Give the channel a 1-element time buffer.
// If the client falls behind while reading, we drop ticks
// on the floor until the client catches up.
c := make(chan Time, 1)
t := &Ticker{
C: c,
r: runtimeTimer{
when: when(d),
period: int64(d),
f: sendTime,
arg: c,
},
}
startTimer(&t.r)
return t
}

NewTicker()只是構(gòu)造了一個Ticker,然后把Ticker.r通過startTimer()交給系統(tǒng)協(xié)程維護。

其中period為事件觸發(fā)的周期。

其中??sendTime()??方法便是定時器觸發(fā)時的動作:

func sendTime(c interface{}, seq uintptr) {
select {
case c.(chan Time) <- Now():
default:
}
}

??sendTime?? 接收一個管道作為參數(shù),其主要任務(wù)是向管道中寫入當(dāng)前時間。

停止Ticker:

停止Ticker,只是簡單的把Ticker從系統(tǒng)協(xié)程中移除。

函數(shù)主要實現(xiàn)如下:

func (t *Ticker) Stop() {
stopTimer(&t.r)
}

??stopTicker()?? 即通知系統(tǒng)協(xié)程把該 Ticker 移除,即不再監(jiān)控。系統(tǒng)協(xié)程只是移除 Ticker 并不會關(guān)閉管道,以避免用戶協(xié)程讀取錯誤。

Ticker 使用方式

例子一:

package main
import (
"fmt"
"time"
)
func main() {
TimeTicker := time.NewTicker(3 * time.Second)
tickerChannel := make(chan bool)
go func() {
for {
select {
case timeticker := <-TimeTicker.C:
fmt.Println("The time for current is : ", timeticker)
case <-tickerChannel:
return
}
}
}()
time.Sleep(6 * time.Second)
TimeTicker.Stop()
tickerChannel <- true
fmt.Println("Time for running ticker is completed")
}

運行該代碼:

$ go run main.go
The time for current is : 2022-04-29 22:37:13.93862 +0800 CST m=+3.000267823
The time for current is : 2022-04-29 22:37:16.939081 +0800 CST m=+6.000707515
Time for running ticker is completed

例子二:

package main
import (
"fmt"
"time"
)
func main() {
tm := time.Millisecond
tickerTicker := time.NewTicker(400 * tm)
tickerChaneel := make(chan bool)
go func() {
for {
select {
case <-tickerChaneel:
return
case tmtr := <-tickerTicker.C:
fmt.Println("Ticker time at current is", tmtr)
}
}
}()
time.Sleep(1400 * time.Millisecond)
tickerTicker.Stop()
tickerChaneel <- true
fmt.Println("Ticker has stopped now")
}

運行該代碼:

$ go run main.go
Ticker time at current is 2022-04-29 22:39:51.13057 +0800 CST m=+0.400159916
Ticker time at current is 2022-04-29 22:39:51.531516 +0800 CST m=+0.801102997
Ticker time at current is 2022-04-29 22:39:51.931238 +0800 CST m=+1.200822301
Ticker has stopped now

總結(jié)

本文簡單了解了 go 計時器 ??Ticker??? 的基本概念,介紹了它的工作原理,并且我們專注于 go 語言中 ??ticker?? 的語法和使用。最后展現(xiàn)了 go 語言中的一些重要示例。

到此這篇關(guān)于Go 語言入門之Go 計時器介紹的文章就介紹到這了,更多相關(guān)Go計時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go1.18新特性使用Generics泛型進行流式處理

    Go1.18新特性使用Generics泛型進行流式處理

    這篇文章主要為大家介紹了Go1.18新特性使用Generics泛型進行流式處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • go判斷文件夾是否存在并創(chuàng)建的實例

    go判斷文件夾是否存在并創(chuàng)建的實例

    這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 解決go mod私有倉庫拉取的問題

    解決go mod私有倉庫拉取的問題

    這篇文章主要介紹了解決go mod私有倉庫拉取的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言io?pipe源碼分析詳情

    Go語言io?pipe源碼分析詳情

    這篇文章主要介紹了Go語言io?pipe源碼分析詳情,pipe是一個適配器,用于連接Reader和Writer,pipe的方法不多,新的寫法卻不少,并且結(jié)構(gòu)體分兩塊,讀寫信道和結(jié)束標(biāo)識,下面進入文章了解具體的內(nèi)容吧
    2022-02-02
  • Go?數(shù)據(jù)結(jié)構(gòu)之二叉樹詳情

    Go?數(shù)據(jù)結(jié)構(gòu)之二叉樹詳情

    這篇文章主要介紹了?Go?數(shù)據(jù)結(jié)構(gòu)之二叉樹詳情,二叉樹是一種數(shù)據(jù)結(jié)構(gòu),在每個節(jié)點下面最多存在兩個其他節(jié)點。即一個節(jié)點要么連接至一個、兩個節(jié)點或不連接其他節(jié)點,下文基于GO語言展開二叉樹結(jié)構(gòu)詳情,需要的朋友可以參考一下
    2022-05-05
  • Windows下Goland的環(huán)境搭建過程詳解

    Windows下Goland的環(huán)境搭建過程詳解

    這篇文章主要介紹了Windows下Goland的環(huán)境搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • GoLang nil與interface的空指針深入分析

    GoLang nil與interface的空指針深入分析

    Go語言中任何類型在未初始化時都對應(yīng)一個零值:布爾類型是false,整型是0,字符串是"",而指針、函數(shù)、interface、slice、channel和map的零值都是nil
    2022-12-12
  • golang 切片截取參數(shù)方法詳解

    golang 切片截取參數(shù)方法詳解

    這篇文章主要介紹了golang 切片截取參數(shù)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • GO語言利用K近鄰算法實現(xiàn)小說鑒黃

    GO語言利用K近鄰算法實現(xiàn)小說鑒黃

    本文給大家分享的是一段GO語言利用K近鄰算法實現(xiàn)小說鑒黃的方法,本方法的鑒別的關(guān)鍵是關(guān)鍵是向量點的選擇和閾值的判定,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • go語言實現(xiàn)順序存儲的棧

    go語言實現(xiàn)順序存儲的棧

    這篇文章主要介紹了go語言實現(xiàn)順序存儲的棧,實例分析了Go語言實現(xiàn)順序存儲的棧的原理與各種常見的操作技巧,需要的朋友可以參考下
    2015-03-03

最新評論