go的一條哲學是
不要通過共享來實現通信,而是通信來實現共享
多協程之間通過 channel 來實現通信,而普遍會遇到的問題是,如何進行超時控制,資料一查詢,需要配置select
和time.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后
其實這代表每次從通道中獲取數據的超時時間,如果又有新的數據輸入,那么時間會重新計時