【问题标题】:Unexpected behavior on Ticker interval changeTicker 间隔更改的意外行为
【发布时间】:2014-05-01 08:41:53
【问题描述】:

我天真地写了一段代码来改变 time.Ticker 的间隔,并且在审查它时我很生气:

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Second)
    switcher := time.NewTimer(16 * time.Second)
    for {
        select {
        case <-ticker.C:
            fmt.Println("ticker " + time.Now().Format("15:04:05"))
        case <-switcher.C:
            fmt.Println("switching")
            ticker = time.NewTicker(1 * time.Second)
        }
    }
}

$ 运行 main.go
股票代码 02:19:03
股票代码 02:19:08
股票代码 02:19:13
切换
股票代码 02:19:15
股票代码 02:19:16
股票代码 02:19:17

它做我想做的事,即将ticker Ticker 的频率在 16 秒后切换到 1 秒。但是,再次阅读它,我希望在 16 秒后创建一个新的 Ticker 对象,而 select 语句包含对旧通道的引用,防止它进行垃圾收集并继续每五秒计时一次。

那么为什么这段代码会改变代码的频率呢?

【问题讨论】:

    标签: go


    【解决方案1】:

    select 语句不是闭包,也不“持有”对任何东西的引用。 您只是简单地替换了ticker 的值,正如您所看到的,间隔会相应地发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2016-11-01
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多