中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Go實現計時器

發布時間:2022-05-05 09:12:37 來源:億速云 閱讀:128 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么用Go實現計時器”,在日常操作中,相信很多人在怎么用Go實現計時器問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用Go實現計時器”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

引言

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

Go 的計時器

Go 提供了非常簡單的語法來實現一個計時器,定時器的結構體定義:

type Ticker struct {
C <-chan Time // 拋出來的channel,給上層系統使用,實現計時
r runtimeTimer // 給系統管理使用的定時器,系統通過該字段確定定時器是否到時,如果到時,調用對應的函數向C中推送當前時間。
}

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

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

import time
TimeTicker := time.NewTicker(1 * time.Second)
TimeTicker.Stop()
  • time : 如果想要使用time 中的計時器,那么需要將其導入代碼中

  • NewTicker() 函數:這個很好理解,新建一個計時器,然后該計時器以時間表達式作為參數,比如一秒1*time.Second ,而不是直接傳入1 ,也可以傳入其他時間方式,比如2*time.Millisecond

  • 最后,我們可以使用時間表達式調用由NewTicker 函數創建的變量上的任何活動。例如,在上面的語法中,我們使用了TimeTicker.Stop() 來停止時間計時器。我們可以在特定條件下使用它,比如定義倒數 10 秒的計時器,就可以檢查時間是否滿足 10 秒,一旦 10 秒發生,我們可以調用TimeTicker.stop()

我們可以每隔一秒輸出一個結果,比如實現一個倒數 10 個數的功能:

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
}
}
}

然后執行該程序:

$ 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創建的計時器與NewTimer創建的計時器持有的時間channel一樣都是帶一個緩存的channel,每次觸發后執行的函數也是sendTime,這樣即保證了無論有誤接收方Ticker觸發時間事件時都不會阻塞:

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()只是構造了一個Ticker,然后把Ticker.r通過startTimer()交給系統協程維護。

其中period為事件觸發的周期。

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

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

sendTime 接收一個管道作為參數,其主要任務是向管道中寫入當前時間。

停止Ticker:

停止Ticker,只是簡單的把Ticker從系統協程中移除。

函數主要實現如下:

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

stopTicker() 即通知系統協程把該 Ticker 移除,即不再監控。系統協程只是移除 Ticker 并不會關閉管道,以避免用戶協程讀取錯誤。

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

到此,關于“怎么用Go實現計時器”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

凤庆县| 古浪县| 榆林市| 南昌市| 鄱阳县| 泰州市| 吉木萨尔县| 申扎县| 永新县| 浪卡子县| 靖安县| 禹城市| 久治县| 清徐县| 冷水江市| 昌江| 长白| 新河县| 徐闻县| 平凉市| 夏河县| 什邡市| 凤山县| 武城县| 牙克石市| 太康县| 图片| 南乐县| 尚义县| 平乐县| 稷山县| 芒康县| 塔河县| 元阳县| 江城| 进贤县| 五家渠市| 固镇县| 汝城县| 莫力| 积石山|