上示例
package main import ( // "bytes" // "encoding/json" "fmt" // "os" // "gopkg.in/mgo.v2" // "gopkg.in/mgo.v2/bson" // "io/ioutil" // "net/http" // "strings" // "net/url" "time" ) func main() { ticker := time.NewTicker(10 * time.Second) for i := 0; i < 10; i++ { time := <-ticker.C fmt.Println(time.String()) } }
执行结果
wifimac:webdemo cdpmac$ go run src/server/timetest.go
2015-08-24 16:22:23.590564088 +0800 CST
2015-08-24 16:22:33.591194618 +0800 CST
2015-08-24 16:22:43.587720967 +0800 CST
2015-08-24 16:22:53.590231413 +0800 CST
2015-08-24 16:23:03.591164202 +0800 CST
....
懂的已经不用往下看了。
我真是恨透了 go编译运行时的依赖检查!有引入,但没应用的包,有创建,但没有使用的的变量,不让过。
另发现了特别情况
输出时间,完全不按常理,
fmt.Println 理论上是按行输出,理这个例子里
其实结果是这样的
2015-08-24 16:22:23.590564088 +0800 CST2015-08-24 16:22:33.591194618 +0800 CST2015-08-24 16:22:43.587720967 +0800 CST2015-08-24 16:22:53.590231413 +0800 CST2015-08-24 16:23:03.591164202 +0800 CST2015-08-24 16:23:13.588811769 +0800 CST2015-08-24 16:23:23.587282627 +0800 CST2015-08-24 16:23:33.588753016 +0800 CST2015-08-24 16:23:43.591157197 +0800 CST2015-08-24 16:23:53.589934072 +0800 CST
应该是shell的毛病
继续主题
找不到现成的资料。
看官方包的示例test代码
看go的time部分源码 Ticker结构
type Ticker struct { C <-chan Time // The channel on which the ticks are delivered. r runtimeTimer }
Time也类似
有一个只读的chanel“对象”
go的time和ticket的调用
或者叫timmer internal和其他语言的开发思路完全不一样。
其他语言,多是注册回调函数,定时,时间到了调用回调。
go是 通过 chan
的阻塞实现的。
调用的地方,读取chan
定时,时间到,向chan写入值,阻塞解除,调用函数。