package main import ( "fmt" "time" ) func main(){ //创建一个定时器,时间为2s,2s过后会自动往通道里面写入数据 //数据只会写一次 timer := time.NewTimer(2 * time.Second) fmt.Println("当前时间", time.Now())//当前时间 2018-09-11 21:47:46.1274704 +0800 CST m=+0.001994901 //2s后,timer.C里面会有数据可以读 t := <-timer.C//没有数据前会阻塞 fmt.Println("现在时间",t)//现在时间 2018-09-11 21:47:48.1280881 +0800 CST m=+2.002612601 }
package main import ( "fmt" "time" ) //实现延时功能 func main(){ //1.延时两秒钟打印一句话 timer:= time.NewTimer(time.Second * 2) fmt.Println("------")//注意这里是不会卡住的,time.Newtimer()执行完是不会等待的,会直接往下走 <- timer.C //这里是会卡住,因为必须要等两秒后,timer.C里面有数据才行 fmt.Println("------") //2.延时两秒钟打印一句话 time.Sleep(time.Second * 2) fmt.Println("------") //3.延时两秒钟打印一句话 //注意:NewTimer会有一个返回值(timer),数据写在了timer.C里面,我们需要往timer.C里面读取数据 //但是After本身就直接返回一个通道,两秒后往通道里面写数据,所以我们直接从After这里读取数据即可 //先是没有数据,然后等两秒后,数据写入,就可以读了 <- time.After(time.Second * 2) fmt.Println("------") }
package main import ( "fmt" "time" ) //定时器停止 func main(){ //3s后,time.C里面会有数据可以读 timer:=time.NewTimer(time.Second * 3) //注意这里是不会阻塞的,当遇见time.C才会阻塞 go func() { <-timer.C fmt.Println("子协程可以打印了") }() timer.Stop()//当我停止了定时器,子协程里面变无法再往下执行了,所以是不会有打印结果的 //让主协程不停下 for{ } }
package main import ( "fmt" "time" ) //定时器重置 func main(){ //3s后,time.C里面会有数据可以读 timer:=time.NewTimer(time.Second * 3) //这里我重置定时器,那么上面的3s便无效了,因此会在一秒钟之后打印 timer.Reset(time.Second * 1) <- timer.C fmt.Println("时间到") }
package main import ( "fmt" "time" ) //ticker的使用 func main(){ //和timer不一样,ticker是周期性的循环,像闹钟一样 ticker:=time.NewTicker(time.Second * 1) i:=0 for { <-ticker.C i++ fmt.Println("i=",i) if i==9{ break } } } /* i= 1 i= 2 i= 3 i= 4 i= 5 i= 6 i= 7 i= 8 i= 9 */