我想动态更改我的自动收报机间隔.
我写了一个例子来告诉你我是怎么做的.我的用例不是"加速度计",但我希望它能给你一个想法.
http://play.golang.org/p/6ANFnoE6pA
package main
import (
"time"
"log"
"fmt"
)
func main() {
interval := float64(1000)
ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)
go func(){
counter := 1.0
for range ticker.C {
log.Println("ticker accelerating to " + fmt.Sprint(interval/counter) + " ms")
ticker = time.NewTicker(time.Duration(interval/counter) * time.Millisecond)
counter++
}
log.Println("stopped")
}()
time.Sleep(5 * time.Second)
log.Println("stopping ticker")
ticker.Stop()
}
Run Code Online (Sandbox Code Playgroud)
有问题的是,自动收报机每秒都会"嘀嗒"一声并且它不会加速......任何想法?
遵循@fzerorubigd的答案,但更完整一些。
如前所述,我们不能在range
这种情况下使用 ,因为range
循环缓存要删除的变量,然后它不能被覆盖(例如:http : //play.golang.org/p/yZvrgURz4o)
然后,我们应该使用for
-select
组合循环。此后的工作解决方案:
http://play.golang.org/p/3uJrAIhnTQ
package main
import (
"time"
"log"
"fmt"
)
func main() {
start_interval := float64(1000)
quit := make(chan bool)
go func(){
ticker := time.NewTicker(time.Duration(start_interval) * time.Millisecond)
counter := 1.0
for {
select {
case <-ticker.C:
log.Println("ticker accelerating to " + fmt.Sprint(start_interval/counter) + " ms")
ticker.Stop()
ticker = time.NewTicker(time.Duration(start_interval/counter) * time.Millisecond)
counter++
case <-quit:
ticker.Stop()
log.Println("..ticker stopped!")
return
}
}
}()
time.Sleep(5 * time.Second)
log.Println("stopping ticker...")
quit<-true
time.Sleep(500 * time.Millisecond) // just to see quit messages
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么在 go1.15 中ticker.Reset
引入了,您不需要创建新的股票代码并使用 更新现有股票代码的持续时间ticker.Reset("new duration")
,现在您将不会遇到任何缓存问题
package main
import (
"fmt"
"log"
"time"
)
func main() {
interval := float64(1000)
ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)
go func(){
counter := 1.0
for range ticker.C {
log.Println("ticker accelerating to " + fmt.Sprint(interval/counter) + " ms")
ticker.Reset(time.Duration(interval/counter) * time.Millisecond)
counter++
}
log.Println("stopped")
}()
time.Sleep(5 * time.Second)
log.Println("stopping ticker")
ticker.Stop()
}
Run Code Online (Sandbox Code Playgroud)
您的示例存在缓存问题的原因是,当您使用结构重新分配ticker
变量时*time.ticker
,您只需取消原始*time.ticker
结构与ticker
变量的链接,但循环仍然是原始的股票通道,您需要重新设置一个新的循环到新的通道time.ticker.c