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

Go?語(yǔ)言入門之Go?計(jì)時(shí)器介紹

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

引言

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

Go 的計(jì)時(shí)器

Go 提供了非常簡(jiǎn)單的語(yǔ)法來(lái)實(shí)現(xiàn)一個(gè)計(jì)時(shí)器,定時(shí)器的結(jié)構(gòu)體定義:

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

Ticker對(duì)外僅暴露一個(gè) channel,指定的時(shí)間到來(lái)時(shí)就往該 channel 中寫入系統(tǒng)時(shí)間,也即一個(gè)事件。

Ticker 的使用方式也很簡(jiǎn)單,代碼如下:

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

我們可以每隔一秒輸出一個(gè)結(jié)果,比如實(shí)現(xiàn)一個(gè)倒數(shù) 10 個(gè)數(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 計(jì)時(shí)器是如何工作的?

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

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)造了一個(gè)Ticker,然后把Ticker.r通過(guò)startTimer()交給系統(tǒng)協(xié)程維護(hù)。

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

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

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

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

停止Ticker:

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

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

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

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

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

運(yùn)行該代碼:

$ 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")
}

運(yùn)行該代碼:

$ 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é)

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

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

相關(guān)文章

  • Go語(yǔ)言結(jié)構(gòu)體Go range的學(xué)習(xí)教程

    Go語(yǔ)言結(jié)構(gòu)體Go range的學(xué)習(xí)教程

    這篇文章主要為大家介紹了Go語(yǔ)言結(jié)構(gòu)體Go range的學(xué)習(xí)教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 圖文詳解Go中的channel

    圖文詳解Go中的channel

    Channel是go語(yǔ)言內(nèi)置的一個(gè)非常重要的特性,也是go并發(fā)編程的兩大基石之一,下面這篇文章主要給大家介紹了關(guān)于Go中channel的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Golang中大端序和小端序的處理

    Golang中大端序和小端序的處理

    大端序和小端序是描述多字節(jié)數(shù)據(jù)在內(nèi)存中存儲(chǔ)順序的術(shù)語(yǔ),本文主要介紹了Golang中大端序和小端序的處理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解

    Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解

    這篇文章主要為大家介紹了Golang?urfave/cli庫(kù)簡(jiǎn)單應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射

    Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射

    這篇文章主要為大家介紹了Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API實(shí)戰(zhàn)示例詳解

    Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API實(shí)戰(zhàn)示例詳解

    這篇文章主要為大家介紹了Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • go?閉包c(diǎn)ase示例代碼

    go?閉包c(diǎn)ase示例代碼

    這篇文章解釋了Go語(yǔ)言中匿名函數(shù)、閉包、立即執(zhí)行函數(shù)表達(dá)式(IIFE)和變量作用域的概念,它通過(guò)一個(gè)示例代碼展示了匿名函數(shù)如何捕獲并修改外部變量,以及如何使用立即執(zhí)行函數(shù)表達(dá)式來(lái)立即執(zhí)行這個(gè)匿名函數(shù),感興趣的朋友一起看看吧
    2025-02-02
  • Go高級(jí)特性探究之信號(hào)處理詳解

    Go高級(jí)特性探究之信號(hào)處理詳解

    信號(hào)是在Unix和類Unix操作系統(tǒng)中用于通知進(jìn)程發(fā)生了事件或異常的通信機(jī)制,本文主要來(lái)介紹一下Go中的信號(hào)處理的方法,需要的可以參考一下
    2023-06-06
  • golang協(xié)程池設(shè)計(jì)詳解

    golang協(xié)程池設(shè)計(jì)詳解

    這篇文章主要介紹了golang協(xié)程池設(shè)計(jì)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go下載安裝及切換不同版本的實(shí)現(xiàn)方法

    Go下載安裝及切換不同版本的實(shí)現(xiàn)方法

    本文詳細(xì)介紹了如何下載和安裝Go語(yǔ)言,以及如何切換不同版本的Go,通過(guò)提供詳細(xì)的步驟和解釋,幫助讀者理解Go語(yǔ)言的安裝和版本管理
    2024-12-12

最新評(píng)論

马鞍山市| 佛山市| 雷州市| 鹰潭市| 筠连县| 陇西县| 体育| 伊金霍洛旗| 广元市| 白水县| 揭东县| 新绛县| 永寿县| 巫溪县| 丰城市| 陇西县| 肥西县| 咸阳市| 乾安县| 祁阳县| 扶风县| 迁西县| 广丰县| 马公市| 巢湖市| 武威市| 兴安盟| 常熟市| 荆门市| 江孜县| 祥云县| 泸水县| 静乐县| 莲花县| 濉溪县| 上杭县| 建德市| 博野县| 吉木乃县| 德江县| 蚌埠市|