欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > Go 1.23中Timer无buffer的实现方式是怎样的?

Go 1.23中Timer无buffer的实现方式是怎样的?

2025/3/1 13:05:06 来源:https://blog.csdn.net/wuchaoyong0413/article/details/145937913  浏览:    关键词:Go 1.23中Timer无buffer的实现方式是怎样的?

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

在 Go 1.23 中,Timer 的实现通常是通过 time 包提供的 time.Timer 类型来实现的。Timer 是一个用于在指定时间后触发一次事件的计时器。Timer 的实现并不依赖于缓冲区,而是通过 Go 的调度器和通道机制来实现的。

Timer 的基本实现

Timer 的核心是一个 time.Timer 结构体,它包含一个 time.Timer.C 通道,当计时器到期时,当前时间会被发送到这个通道。

以下是一个简单的 Timer 实现示例:

package mainimport ("fmt""time"
)func main() {// 创建一个 Timer,设置 2 秒后触发timer := time.NewTimer(2 * time.Second)// 等待 Timer 触发<-timer.Cfmt.Println("Timer expired")// 如果你想要停止 Timer,可以使用 Stop() 方法// timer.Stop()
}

无缓冲区的实现

Timer 的实现并不依赖于缓冲区,而是通过 Go 的通道机制来实现的。Timer.C 是一个无缓冲的通道,当计时器到期时,当前时间会被发送到这个通道。由于通道是无缓冲的,发送操作会阻塞,直到有接收者准备好接收数据。

自定义无缓冲 Timer 实现

如果你想自己实现一个无缓冲的 Timer,可以使用 time.After 函数,它返回一个通道,当指定的时间到达时,通道会接收到一个时间值。

package mainimport ("fmt""time"
)func main() {// 使用 time.After 创建一个无缓冲的 TimertimerCh := time.After(2 * time.Second)// 等待 Timer 触发<-timerChfmt.Println("Timer expired")
}

更复杂的 Timer 实现

如果你需要更复杂的 Timer 实现,比如可以重置或停止的 Timer,可以参考以下代码:

package mainimport ("fmt""time"
)type MyTimer struct {duration time.Durationtimer    *time.TimerresetCh  chan time.DurationstopCh   chan struct{}
}func NewMyTimer(duration time.Duration) *MyTimer {t := &MyTimer{duration: duration,resetCh:  make(chan time.Duration),stopCh:   make(chan struct{}),}t.timer = time.NewTimer(duration)go t.run()return t
}func (t *MyTimer) run() {for {select {case <-t.timer.C:fmt.Println("Timer expired")returncase newDuration := <-t.resetCh:if !t.timer.Stop() {<-t.timer.C}t.timer.Reset(newDuration)case <-t.stopCh:if !t.timer.Stop() {<-t.timer.C}return}}
}func (t *MyTimer) Reset(duration time.Duration) {t.resetCh <- duration
}func (t *MyTimer) Stop() {t.stopCh <- struct{}{}
}func main() {timer := NewMyTimer(2 * time.Second)time.Sleep(1 * time.Second)timer.Reset(3 * time.Second)time.Sleep(2 * time.Second)timer.Stop()fmt.Println("Timer stopped")
}

在这个示例中,MyTimer 是一个自定义的 Timer 实现,它支持重置和停止操作。MyTimer 使用 time.Timer 作为底层实现,并通过通道来接收重置和停止的信号。

总结

Go 中的 Timer 实现依赖于无缓冲的通道和 Go 的调度器。你可以使用 time.Timertime.After 来创建简单的 Timer,或者通过自定义结构体来实现更复杂的 Timer 功能。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词