• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Go 1.23中Timer无buffer的实现方式详解

    发布者: 姬7089 | 发布时间: 2025-8-14 08:25| 查看数: 28| 评论数: 0|帖子模式

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

    Timer 的基本实现

    Timer 的核心是一个 time.Timer 结构体,它包含一个 time.Timer.C 通道,当计时器到期时,当前时间会被发送到这个通道。
    以下是一个简单的 Timer 实现示例:
    1. package main

    2. import (
    3.         "fmt"
    4.         "time"
    5. )

    6. func main() {
    7.         // 创建一个 Timer,设置 2 秒后触发
    8.         timer := time.NewTimer(2 * time.Second)

    9.         // 等待 Timer 触发
    10.         <-timer.C
    11.         fmt.Println("Timer expired")

    12.         // 如果你想要停止 Timer,可以使用 Stop() 方法
    13.         // timer.Stop()
    14. }
    复制代码
    无缓冲区的实现

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

    自定义无缓冲 Timer 实现

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

    2. import (
    3.         "fmt"
    4.         "time"
    5. )

    6. func main() {
    7.         // 使用 time.After 创建一个无缓冲的 Timer
    8.         timerCh := time.After(2 * time.Second)

    9.         // 等待 Timer 触发
    10.         <-timerCh
    11.         fmt.Println("Timer expired")
    12. }
    复制代码
    更复杂的 Timer 实现

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

    2. import (
    3.         "fmt"
    4.         "time"
    5. )

    6. type MyTimer struct {
    7.         duration time.Duration
    8.         timer    *time.Timer
    9.         resetCh  chan time.Duration
    10.         stopCh   chan struct{}
    11. }

    12. func NewMyTimer(duration time.Duration) *MyTimer {
    13.         t := &MyTimer{
    14.                 duration: duration,
    15.                 resetCh:  make(chan time.Duration),
    16.                 stopCh:   make(chan struct{}),
    17.         }
    18.         t.timer = time.NewTimer(duration)
    19.         go t.run()
    20.         return t
    21. }

    22. func (t *MyTimer) run() {
    23.         for {
    24.                 select {
    25.                 case <-t.timer.C:
    26.                         fmt.Println("Timer expired")
    27.                         return
    28.                 case newDuration := <-t.resetCh:
    29.                         if !t.timer.Stop() {
    30.                                 <-t.timer.C
    31.                         }
    32.                         t.timer.Reset(newDuration)
    33.                 case <-t.stopCh:
    34.                         if !t.timer.Stop() {
    35.                                 <-t.timer.C
    36.                         }
    37.                         return
    38.                 }
    39.         }
    40. }

    41. func (t *MyTimer) Reset(duration time.Duration) {
    42.         t.resetCh <- duration
    43. }

    44. func (t *MyTimer) Stop() {
    45.         t.stopCh <- struct{}{}
    46. }

    47. func main() {
    48.         timer := NewMyTimer(2 * time.Second)

    49.         time.Sleep(1 * time.Second)
    50.         timer.Reset(3 * time.Second)

    51.         time.Sleep(2 * time.Second)
    52.         timer.Stop()
    53.         fmt.Println("Timer stopped")
    54. }
    复制代码
    在这个示例中,MyTimer 是一个自定义的 Timer 实现,它支持重置和停止操作。MyTimer 使用 time.Timer 作为底层实现,并通过通道来接收重置和停止的信号。

    总结

    Go 中的 Timer 实现依赖于无缓冲的通道和 Go 的调度器。你可以使用 time.Timer 或 time.After 来创建简单的 Timer,或者通过自定义结构体来实现更复杂的 Timer 功能。
    到此这篇关于Go 1.23中Timer无buffer的实现方式详解的文章就介绍到这了,更多相关Go实现Timer无buffer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表