1. 程式人生 > 其它 >Go從入門到精通——示例:使用通道響應計時器的事件

Go從入門到精通——示例:使用通道響應計時器的事件

示例:使用通道響應計時器的事件

  Go語言中的 time 包提供了計時器的封裝。

  由於 Go 語言中的通道和 goroutine 的設計,定時任務可以在 goroutine 中通過同步的方式完成,也可以通過 goroutine 中非同步回撥完成。

1、一段時間之後(time.After)

package main

import (
	"fmt"
	"time"
)

func main() {
	//宣告一個退出用的通道
	exit := make(chan int)

	//列印開始
	fmt.Println("Start")

	//過1秒後,呼叫匿名函式
	//AfterFunc()函式用於等待經過的時間,此後,它將在其自己的go-routine中呼叫已定義的函式“func()”
	time.AfterFunc(time.Second,
		func() {

			// Printed after stated duration
			// by AfterFunc() method is over
			fmt.Println("1 seconds over....")

			//通知 main() 的 goroutine 已經結束
			exit <- 0
		})

	//等待結束
	<-exit
}

2、定點計時

  計時器(Timer)的原理和倒計時鬧鐘類似,都是給定多少時間後出發。打點器(Ticker)的原理和鐘錶類似,鐘錶每到整點就會觸發。這兩種方法建立後會返回 time.Ticker 物件和 time.Timer 物件,裡面通過一個 C 成員,型別是隻能接收的時間通道(<-chan Time),使用這個通道就可以獲得時間觸發的通知。

  下面程式碼建立一個打點器,每 500 毫秒觸發一起;建立一個計時器,2秒後觸發,只觸發一次。