2014-05-01 231 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的值,如您所見,間隔會相應更改。