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

go語言中Timer和Ticker兩種計時器的使用

 更新時間:2024年08月14日 11:05:14   作者:m舊褲子  
go語言中有Timer和Ticker這樣的兩種計時器,兩種計時器分別實現(xiàn)了不同的計時功能,本文主要介紹了go語言中Timer和Ticker兩種計時器的使用,感興趣的可以了解一下

介紹

go語言中有Timer和Ticker這樣的兩種計時器,兩種計時器分別實現(xiàn)了不同的計時功能。

  • Timer是單次時間事件,指在指定的單次時間過后觸發(fā),然后向自己channel中發(fā)送當(dāng)時時間,此后Timer不再計時。
  • Ticker是多次時間事件,指每隔一段事件都觸發(fā)一次,并向自己channel發(fā)送當(dāng)前時間。
  • 類似于javascript中的setTimeout()和setInterval()兩種計時器。

Timer計時及其方法

type Timer struct {
    C <-chan Time
    // 內(nèi)含隱藏或非導(dǎo)出字段
}

Timer類型代表單次時間事件。當(dāng)Timer到期時,當(dāng)時的時間會被發(fā)送給C。

NewTimer

func NewTimer(d Duration) *Timer

NewTimer創(chuàng)建一個Timer,它會在最少過去時間段d后到期,向其自身的C字段發(fā)送當(dāng)時的時間。

使用:

package main

import (
	"fmt"
	"time"
)
func main() {
	timer := time.NewTimer(10 * time.Second)

	t1 := time.Now()
	fmt.Printf("t1:%v\n", t1)
	t2 := <-timer.C
	fmt.Printf("t2:%v\n", t2)
}

輸出:

t1:2023-04-29 22:13:20.3142549 +0800 CST m=+0.002562901
t2:2023-04-29 22:13:30.328093 +0800 CST m=+10.016401001

程序輸出t1后,又計時了10秒輸出了t2

Stop

func (t *Timer) Stop() bool

Stop停止Timer的執(zhí)行。如果停止了t會返回真;如果t已經(jīng)被停止或者過期了會返回假。Stop不會關(guān)閉通道t.C,以避免從該通道的讀取不正確的成功。

使用:

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.NewTimer(10 * time.Second)

	t1 := time.Now()
	fmt.Printf("t1:%v\n", t1)
	//停止計時器
	timer.Stop()
	t2 := time.Now()
	fmt.Printf("t2:%v\n", t2)
	t3 := <-timer.C
	fmt.Printf("t3:%v\n", t3)
}

輸出:

t1:2023-04-29 22:25:05.921852 +0800 CST m=+0.002725901
t2:2023-04-29 22:25:05.9372012 +0800 CST m=+0.018075101
fatal error: all goroutines are asleep - deadlock! 

可見,程序在timer使用了stop方法以后輸出t3就報出了all goroutines are asleep - deadlock! 錯誤。

Reset

func (t *Timer) Reset(d Duration) bool

Reset使t重新開始計時,(本方法返回后再)等待時間段d過去后到期。如果調(diào)用時t還在等待中會返回真;如果t已經(jīng)到期或者被停止了會返回假。

使用:

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.NewTimer(10 * time.Second)

	t1 := time.Now()
	fmt.Printf("t1:%v\n", t1)
	//程序休眠2s
	time.Sleep(2 * time.Second)
	//重新設(shè)置時間間隔
	timer.Reset(15 * time.Second)
	t2 := time.Now()
	fmt.Printf("t2:%v\n", t2)
	t3 := <-timer.C
	fmt.Printf("t3:%v\n", t3)
}

輸出:

t1:2023-04-29 22:33:53.4179209 +0800 CST m=+0.002563001
t2:2023-04-29 22:33:55.4452012 +0800 CST m=+2.029843301
t3:2023-04-29 22:34:10.4605181 +0800 CST m=+17.045160201

計時器被重新設(shè)置后會根據(jù)設(shè)置的時間段重新計時,到時間后,計時結(jié)束,向其自身的C字段發(fā)送當(dāng)時的時間。

Ticker計時及其方法

type Ticker struct {
C <-chan Time // 周期性傳遞時間信息的通道
// 內(nèi)含隱藏或非導(dǎo)出字段
}

Ticker保管一個通道,并每隔一段時間向其傳遞"tick"。

NewTicker

func NewTicker(d Duration) *Ticker

NewTicker返回一個新的Ticker,該Ticker包含一個通道字段,并會每隔時間段d就向該通道發(fā)送當(dāng)時的時間。它會調(diào)整時間間隔或者丟棄tick信息以適應(yīng)反應(yīng)慢的接收者。如果d<=0會panic。關(guān)閉該Ticker可以釋放相關(guān)資源。

func (t *Ticker) Stop()

Stop關(guān)閉一個Ticker。在關(guān)閉后,將不會發(fā)送更多的tick信息。Stop不會關(guān)閉通道t.C,以避免從該通道的讀取不正確的成功。

使用:

package main

import (
	"fmt"
	"time"
)

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

輸出;

i: 10
i: 9
i: 8
i: 7
i: 6
i: 5
i: 4
i: 3
i: 2
i: 1

可見,程序中,每隔設(shè)置的1s時間就觸發(fā)一次定時器,并且向自帶的channel C中傳遞當(dāng)時時間。

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

相關(guān)文章

  • GO語io包的常用接口

    GO語io包的常用接口

    這篇文章主要介紹了GO語io包的常用接口,分析了GO語言接口的概念與功能,并實例列舉了幾個最常用的接口的用法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • 重學(xué)Go語言之如何使用Modules

    重學(xué)Go語言之如何使用Modules

    Go語言在Go.1.11版本發(fā)布了Go?Modules,這是一種新的Go項目依賴管理解決方案,可以讓Go項目的依賴包關(guān)系更加清晰,也更容易管理,下面就來看看Modules是如何使用的吧
    2023-07-07
  • Go語言中TCP/IP網(wǎng)絡(luò)編程的深入講解

    Go語言中TCP/IP網(wǎng)絡(luò)編程的深入講解

    這篇文章主要給大家介紹了關(guān)于Go語言中TCP/IP網(wǎng)絡(luò)編程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • 一文掌握Golang模糊測試

    一文掌握Golang模糊測試

    本文主要介紹了一文掌握Golang模糊測試,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go語言轉(zhuǎn)換所有字符串為大寫或者小寫的方法

    Go語言轉(zhuǎn)換所有字符串為大寫或者小寫的方法

    這篇文章主要介紹了Go語言轉(zhuǎn)換所有字符串為大寫或者小寫的方法,實例分析了ToLower和ToUpper函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang?websocket協(xié)議使用淺析

    Golang?websocket協(xié)議使用淺析

    這篇文章主要介紹了Golang?websocket協(xié)議的使用,WebSocket是一種新型的網(wǎng)絡(luò)通信協(xié)議,可以在Web應(yīng)用程序中實現(xiàn)雙向通信,感興趣想要詳細了解可以參考下文
    2023-05-05
  • GO workPool的線程池實現(xiàn)

    GO workPool的線程池實現(xiàn)

    本文主要介紹了GO workPool的線程池實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go構(gòu)建高性能的命令行工具使例詳解

    Go構(gòu)建高性能的命令行工具使例詳解

    這篇文章主要為大家介紹了Go構(gòu)建高性能的命令行工具使例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go語言基礎(chǔ)go build命令用法及示例詳解

    Go語言基礎(chǔ)go build命令用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)go build命令用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • golang中連接mysql數(shù)據(jù)庫

    golang中連接mysql數(shù)據(jù)庫

    這篇文章主要介紹了golang中連接mysql數(shù)據(jù)庫的步驟,幫助大家更好的理解和學(xué)習(xí)go語言,感興趣的朋友可以了解下
    2020-12-12

最新評論