3 回答
TA贡献1784条经验 获得超8个赞
遵循@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
}
TA贡献1816条经验 获得超6个赞
正如 Nipun Talukdar 提到的,“for”捕获通道并使用相同的引用进行迭代。如果您像这样使用它,它会修复:
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 {
select {
case <-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()
}
TA贡献2011条经验 获得超2个赞
这就是为什么在 go1.15ticker.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()
}
您的示例存在缓存问题的原因是,当您ticker使用*time.ticker结构重新分配变量时,您只需取消原始*time.ticker结构与ticker变量的链接,但循环仍处于原始代码通道中,您需要将新循环重新分配给新的time.ticker.c
- 3 回答
- 0 关注
- 150 浏览
添加回答
举报