一、知識點
golang定時器使用的類庫是“time”,參考官方文檔建立timer。官方提供了兩種方式建立timer分別是:
1)func AfterFunc(d Duration, f func()) *Timer這方法大概意思是經過d時間間隔,就執行f函數。
2)func NewTimer(d Duration) *Timer這函數打個意思是建立一個timer每過去d時間間隔就發送目前時間到timer的channel裡面。
3)補充一點chan的知識點,channel(通道)是golang裡麵線程通訊的通道。它分為帶緩衝的通道和不帶緩衝的通道。chan也可以建立為只輸入通道或者唯讀入通道或者可讀可寫通道。舉例:
ch := make(chan int) 無緩衝通道(可讀可寫通道)
ch := make(chan int, 10)緩衝為10的通道(可讀可寫通道)
ch := make(chan<- int)無緩衝通道(唯寫通道)
ch := make(<-chan int)無緩衝通道(唯讀通道)
二、實踐
繼續上一篇請求天氣的demo。我們每隔十分鐘定時擷取一下最新天氣。
建立timer執行時間是間隔10分鐘:
timer := time.NewTicker(10* time.Minute)for { <-timer.C rlt, err := doHttpGetRequest("https://restapi.amap.com/v3/weather/weatherInfo?key=你的高德key&city=110101") if err != nil { fmt.Println("net req error") } else { fmt.Println(rlt) }}
在上面代碼中,有一行<-timer.C這句話說明下,首先我們看下timer的資料結構如下:
type Timer struct { C <-chan Time // contains filtered or unexported fields}
timer中有一個只可寫入的通道C變數。我們使用的是func NewTimer(d Duration) *Timer函數來建立timer。那麼我們這個timer就是每十分鐘中向這個通道C中寫入目前時間。我們在代碼中的這行<-timer.C只是為了把通道C的值進行讀出操作。防止線程阻塞,timer無法正常運行。
PS:關於chan更詳細的介紹參考