golang中的定时器
1. timer 定时器,时间到了执行,只执行一次
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | package main import ( "fmt" "time" ) func main() { // 1. timer基本使用 /* timer1 := time.NewTimer(2 * time.Second) t := time.Now() fmt.Printf("t = %v\n", t) t2 := <-timer1.C fmt.Printf("t2 = %v\n", t2) */ // 2. 验证timer只能响应一次 /* timer2 := time.NewTimer(time.Second) for { <-timer2.C // 第一次打印时间到,第二次就会死锁(原因:timer2定时器只往通道中发送一次Time数据) fmt.Println("时间到") } */ // 3. timer实现延时的功能 /* fmt.Println("开始了", time.Now()) time.Sleep(time.Second) fmt.Println("第一次延时:", time.Now()) timer3 := time.NewTimer(2 * time.Second) <-timer3.C fmt.Println("第二次延时:", time.Now()) <-time.After(3 * time.Second) // time.After() 就是对 NewTimer(d).C 的封装 fmt.Println("第三次延时:", time.Now()) */ // 4. 停止定时器 /* timer4 := time.NewTimer(2 * time.Second) go func() { <-timer4.C fmt.Println("定时器执行了") }() //time.Sleep(3 * time.Second) // 注意:如果定时器执行了,然后在调用timer4.Stop()就会返回false,如果没有执行就调用Stop()就会返回true // 定时器一旦被关闭,从定时器通道中读取数据和后面的代码将不会在执行 b := timer4.Stop() if b { fmt.Println("timer4已经关闭") } for { } */ // 5. 重置定时器 fmt.Println(time.Now()) timer6 := time.NewTimer(3 * time.Second) timer6.Reset(time.Second) fmt.Println(<-timer6.C) } |
2. Ticker:时间到了,多次执行
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 | package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { // 2. ticker 定时器,时间到了多次执行 ticker := time.NewTicker(1 * time.Second) wg.Add(1) go func () { i := 1 for { fmt.Println(<-ticker.C) if i == 5 { ticker.Stop() break } i++ } wg.Done() fmt.Println( "子 goroutine结束了" ) }() wg.Wait() fmt.Println( "主 goroutine 结束了..." ) } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)