淺談Go中的time.After


go的一條哲學是

不要通過共享來實現通信,而是通信來實現共享

多協程之間通過 channel 來實現通信,而普遍會遇到的問題是,如何進行超時控制,資料一查詢,需要配置selecttime.After一起使用,一開始我以為是整體的超時時間,后面經過下面的這番時間,發現並不是


func main(){
	c := make(chan int)
	fmt.Println(time.Now())
	go func(){
		time.Sleep(500*time.Millsecond)
		c <- 0
		time.Sleep(500*time.Millsecond)
		c <- 1
	}()
	
	for {
		select {
		case p := <- c:
			fmt.Printf("p=%d\n",c)
		case <-time.After(1*time.Second):
			fmt.Println(time.Now())
			fmt.Printf("timeout")
			return
		}
	}
}

執行的結果是

設置的超時時間是1s,而timeout的時間點是開始執行的2s后

其實這代表每次從通道中獲取數據的超時時間,如果又有新的數據輸入,那么時間會重新計時


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM