我正在玩頻道,我在這里遇到了一些事情。我有一個循環,我想在一段設定的時間后停止,比如 5 秒,我還想將迭代去抖動 300 毫秒。func pump() <-chan interface{} { c := make(chan interface{}) // use for loop // stop after 5 seconds d := time.NewTicker(time.Millisecond * 2000) go func() { myLoop: for { select { case <-time.After(time.Second * 5): fmt.Println("Its five seconds") close(c) d.Stop() break myLoop default: c <- rand.Int() <-d.C fmt.Println("After wait / debounce") } } }() return c}雖然上面的內容似乎是去抖動的,但它永遠不會觸發達到 5 秒的情況。我有類似的結果time.Tick(time.Second * 5)func pump() <-chan interface{} { c := make(chan interface{}) // use for loop // stop after 5 seconds d := time.NewTicker(time.Millisecond * 2000) t := time.NewTicker(time.Second * 5) go func() { myLoop: for { select { case <-t.C: fmt.Println("Its five seconds") close(c) t.Stop() d.Stop() break myLoop // case <-d.C: // fmt.Println("its a sleep") default: c <- rand.Int() // // slow down <-d.C // fmt.Println("After 3000 milliseconds") } } }() return c}func pump() <-chan interface{} { c := make(chan interface{}) // use for loop // stop after 5 seconds d := time.NewTicker(time.Millisecond * 2000) t := time.NewTicker(time.Second * 5) go func() {}以上對我有用;使用另一個代碼。我不明白為什么這會在前者失敗的地方起作用,尤其是當 time.Tick() 在文檔中被描述為等同于 time.NewTicker() 時,只暴露了通道 C。我在這里錯過了什么?代碼片段有明顯不同嗎?
1 回答

素胚勾勒不出你
TA貢獻1827條經驗 獲得超9個贊
根據我的評論:
for {
select {
case <-time.After(time.Second * 5):
...
default:
...
}
}
time.After每次迭代都會創建一個新的計時器 ( )。這意味著計時器永遠不會觸發(因為default)情況將始終被選中。您可以通過在循環 ( playground )之外創建計時器來防止這種情況發生:
timer := time.After(time.Second * 5)
myLoop:
for {
select {
case <-timer:
break myLoop
default:
...
}
}
你的第二個例子對我來說工作正常(見前面提到的游樂場)。請注意,我不確定這些中的任何一個是否會實現您正在尋找的結果,因為它沒有真正定義。
- 1 回答
- 0 關注
- 91 瀏覽
添加回答
舉報
0/150
提交
取消