go語言time.After()的作用
time.After
是一個(gè)非常實(shí)用的函數(shù),它返回一個(gè)用于讀取的單向通道(<-chan time.Time),這個(gè)通道會(huì)在指定的時(shí)間間隔之后發(fā)送當(dāng)前時(shí)間。這個(gè)機(jī)制常被用于實(shí)現(xiàn)超時(shí)控制、延遲執(zhí)行等場(chǎng)景。
應(yīng)用場(chǎng)景:
1.延遲執(zhí)行、定時(shí)任務(wù)
package main import ( "fmt" "time" ) func main() { // 等待3秒 timer := time.After(3 * time.Second) // 阻塞等待time.After的通道發(fā)送時(shí)間 x := <-timer fmt.Println(x) // 當(dāng)上面的<-timer執(zhí)行后,說明已經(jīng)等待了5秒 fmt.Println("3秒已過") // 你可以繼續(xù)執(zhí)行你的邏輯... }
2.超時(shí)控制
time.After
還常用于實(shí)現(xiàn)超時(shí)控制。比如,你可能在發(fā)送一個(gè)HTTP請(qǐng)求時(shí),不希望這個(gè)請(qǐng)求無限制地等待響應(yīng),而是想在某個(gè)超時(shí)時(shí)間后停止等待并處理超時(shí)邏輯:
超時(shí)控制應(yīng)該是非常常見的使用場(chǎng)景。
package main import ( "fmt" "io/ioutil" "net/http" "time" ) func main() { client := &http.Client{ Timeout: 10 * time.Second, // 設(shè)置客戶端超時(shí)時(shí)間 } // 模擬一個(gè)可能會(huì)超時(shí)的請(qǐng)求 resp, err := client.Get("http://example.com/may-timeout") if err != nil { fmt.Println("請(qǐng)求錯(cuò)誤:", err) return } defer resp.Body.Close() // 使用time.After實(shí)現(xiàn)讀取響應(yīng)體的超時(shí) done := make(chan bool, 1) go func() { // 模擬讀取響應(yīng)體,實(shí)際中可能是ioutil.ReadAll(resp.Body) // 這里用time.Sleep模擬耗時(shí)操作 time.Sleep(2 * time.Second) done <- true }() select { case <-done: // 讀取成功 body, _ := ioutil.ReadAll(resp.Body) fmt.Println("讀取響應(yīng)體成功:", string(body)) case <-time.After(1 * time.Second): // 超時(shí) fmt.Println("讀取響應(yīng)體超時(shí)") } }
超時(shí)控制channel結(jié)合了select。
go time.After 定時(shí)器示例
package main import ( "fmt" "time" ) // 定義 stop 函數(shù),接受 deviceid 和 gunid 作為參數(shù) func stop(deviceid int, gunid int) { fmt.Printf("Stopping with device ID: %d and gun ID: %d\n", deviceid, gunid) } func main() { // 設(shè)定要傳遞給 stop 函數(shù)的參數(shù) deviceid := 1 gunid := 2 // 使用 goroutine 異步執(zhí)行計(jì)時(shí)器 go func() { // 創(chuàng)建一個(gè)通道,將在 10 秒后關(guān)閉 timer := time.After(10 * time.Second) // 等待通道關(guān)閉,即等待 10 秒 <-timer // 在 10 秒后執(zhí)行 stop 函數(shù) stop(deviceid, gunid) }() // 主程序可以繼續(xù)執(zhí)行其他任務(wù) fmt.Println("Main program continues to run...") // 為了演示,讓主程序運(yùn)行一段時(shí)間,以便觀察 stop 函數(shù)的執(zhí)行 time.Sleep(15 * time.Second) fmt.Println("Main program ends.") }
3.time.Sleep和time.After的差異
time.Sleep和time.After什么區(qū)別?
time.Sleep
較為簡(jiǎn)單直接。time.After
返回通道(channel),讀取通道時(shí)阻塞來實(shí)現(xiàn)。
到此這篇關(guān)于go語言time.After()的作用的文章就介紹到這了,更多相關(guān)go語言time.After()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go defer與time.sleep的使用與區(qū)別
- 詳解Golang time包中的結(jié)構(gòu)體time.Ticker
- 詳解Golang time包中的time.Duration類型
- 詳解Golang time包中的結(jié)構(gòu)體time.Time
- Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露問題解析
- Golang time.Sleep()用法及示例講解
- go?time.Sleep睡眠指定時(shí)間實(shí)例詳解(小時(shí)級(jí)到納秒級(jí))
- 淺談golang 中time.After釋放的問題
- 解決Golang time.Parse和time.Format的時(shí)區(qū)問題
相關(guān)文章
go實(shí)現(xiàn)整型的二進(jìn)制轉(zhuǎn)化的方法
這篇文章主要介紹了go實(shí)現(xiàn)整型的二進(jìn)制轉(zhuǎn)化的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07golang程序進(jìn)度條實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了golang程序?qū)崿F(xiàn)進(jìn)度條示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08