每日一抄 Go语言使用通道响应计时器事件
package main
import (
"fmt"
"time"
)
/*
Go语言中,time包提供了计时器的封装。由于Go语言中的通道和goroutine的设计,定时任务可以在goroutine
中通过同步的方式完成,也可以通过在goroutine中异步回调完成,这里将展示这两个方法
*/
//一段时间之后 (time.After)
//延迟回调
func main() {
//声明一个退出用的通道
exit := make(chan int)
//打印开始
fmt.Println("start")
//过一秒后调用匿名函数
//传入等待的时间和一个回调,回调使用一个匿名函数,在时间到达后,匿名函数会在另一个goroutine中被调用
time.AfterFunc(time.Second, func() {
//一秒后打印结果
fmt.Println("这就是打印的结果")
//通知main的goroutine已经结束
//这里往通道中写入,代表需要退出。
exit <- 0
})
//这里很重要,代表main的goroutine被阻塞(因为此时通道中是没有值可以拿出来的),要等待一秒后
//第三十行被执行,exit通道中有数据后才能继续执行
<-exit
}
time.AfterFunc() 函数是在 time.After 基础上增加了到时的回调,方便使用。
而 time.After() 函数又是在 time.NewTimer() 函数上进行的封装,下面的例子展示如何使用 timer.NewTimer() 和 time.NewTicker()。
package main
import (
"fmt"
"time"
)
/*
计时器(Timer)的原理和倒计时钟类似,都是给定多少时间后触发。打点器(Ticker)的原理和钟表类似,钟表每到整点就会触发
这两种方法创建后会返回time.Ticker对象和time.Timer对象,里面通过一个C成员,类型是只能接收时间通道(<- chan Time)
使用这个通道就可获得时间触发的通知
*/
//下面代码创建一个打点器。每500ms触发一起;创建一个计时器2s后触发,只触发一次
//计时器
func main() {
//创建一个打点器每500ms触发一次
ticker := time.NewTicker(time.Millisecond * 500)
//创建一个计时器,2s后触发
stopper := time.NewTimer(time.Second * 2)
//声明计数变量
var i int
//不断检查通道情况
for {
//Multiplex chan
select {
//计时器触发
case <-stopper.C:
fmt.Println("stop")
//跳出循环
goto StopHere
//打点器触发
case <-ticker.C:
//记录触发了多少次
i++
fmt.Println("tick", i)
}
}
//退出的标签,使用goto跳转
StopHere:
fmt.Println("done")
}
/*
type Timer struct {
C <-chan Time
r runtimeTimer
}
*/
本文来自博客园,作者:蹇爱黄,转载请注明原文链接:https://www.cnblogs.com/jianjiana/p/16943591.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?