2014-05-01 164 views
1

我天真地写了一段代码来改变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
股票2时19分03秒
股票2点19分08秒
股票二点19分13秒
切换
股票2点十九分15秒
抽动KER二时十九分16秒
股票2时19分十七秒

据我想要做什么,即ticker北京时间频率切换至一个第二个16秒后。但是,再次阅读我预计在16秒后,会创建一个新的Ticker对象,而select语句保留对旧通道的引用,从而防止垃圾收集并保持每五秒钟滴答。

那么为什么这段代码改变了股票的频率?

回答

5

A select语句不是一个闭包,也不“持有”对任何东西的引用。 您只需更换ticker的值,如您所见,间隔会相应更改。