示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package main import ( "fmt" "time" ) func testTimer1() { go func () { fmt.Println( "test timer1" ) }() } func testTimer2() { go func () { fmt.Println(time.Now().String()) }() } func timer1() { timer1 := time.NewTicker(1 * time.Second) for { select { case <-timer1.C: testTimer1() } } } func timer2() { timer2 := time.NewTicker(5 * time.Second) for { select { case <-timer2.C: testTimer2() } } } func main() { go timer1() timer2() } |
运行结果截屏如下:
看go的time部分源码 Ticker结构
1 2 3 4 5 6 7 | type Ticker struct { C <- chan Time // The channel on which the ticks are delivered. r runtimeTimer } |
go的time和ticket的调用
或者叫timmer internal和其他语言的开发思路不一样。
其他语言,多是注册回调函数,定时,时间到了调用回调。
go是 通过 chan
的阻塞实现的。
调用的地方,读取chan
定时,时间到,向chan写入值,阻塞解除,调用函数