這篇我主要看中的 time.After
的實作想法 以及…
time.Sleep1 2 3 4 5 6 7 8 9 10 11 12
| timeout := make(chan bool, 1) go func() { time.Sleep(1 * time.Second) timeout <- true }()
select { case <-ch: case <-timeout: }
|
在實際狀況你應該使用 time.After
,他會返回一個 channel,並且在你指定的時間後發出 signal
Timing out, moving on1 2 3 4 5 6 7 8 9 10 11 12
| func Query(conns []Conn, query string) Result { ch := make(chan Result, 1) for _, conn := range conns { go func(c Conn) { select { case ch <- c.DoQuery(query): default: } }(conn) } return <-ch }
|
我們只要確保 channel 有足夠空間塞入第一個值。
這會確保可以成功送進 channel,並且第一個值會被順利拿出來,且不用管他們的執行順序