返回顶部
分享到

Go 1.23中Timer无buffer的实现方式介绍

Golang 来源:互联网 作者:佚名 发布时间:2025-03-04 21:08:52 人浏览
摘要

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

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

Timer 的基本实现

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package main

 

import (

    "fmt"

    "time"

)

 

func main() {

    // 创建一个 Timer,设置 2 秒后触发

    timer := time.NewTimer(2 * time.Second)

 

    // 等待 Timer 触发

    <-timer.C

    fmt.Println("Timer expired")

 

    // 如果你想要停止 Timer,可以使用 Stop() 方法

    // timer.Stop()

}

无缓冲区的实现

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

自定义无缓冲 Timer 实现

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package main

 

import (

    "fmt"

    "time"

)

 

func main() {

    // 使用 time.After 创建一个无缓冲的 Timer

    timerCh := time.After(2 * time.Second)

 

    // 等待 Timer 触发

    <-timerCh

    fmt.Println("Timer expired")

}

更复杂的 Timer 实现

如果你需要更复杂的 Timer 实现,比如可以重置或停止的 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

package main

 

import (

    "fmt"

    "time"

)

 

type MyTimer struct {

    duration time.Duration

    timer    *time.Timer

    resetCh  chan time.Duration

    stopCh   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")

            return

        case 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.Timer 或 time.After 来创建简单的 Timer,或者通过自定义结构体来实现更复杂的 Timer 功能。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 快速解除oracle dataguard的方法

    快速解除oracle dataguard的方法
    有些时候,我们为了使oracle dg的standby库另做他用,需要解除oracle dataguard数据同步。我本地因为standby库存储出现故障,导致dg存在问题,故需
  • Go 1.23中Timer无buffer的实现方式介绍
    在 Go 1.23 中,Timer 的实现通常是通过 time 包提供的 time.Timer 类型来实现的。Timer 是一个用于在指定时间后触发一次事件的计时器。Timer 的实
  • golang之 wire 库的使用介绍
    1. 写在最前面 之前 review 其他人的代码的时候,看到了关于 wire 库的使用。但当时主要是分析逻辑上的问题,没怎么太学习 wire 库的用法,
  • golang panic 函数用法介绍
    在 Go 语言中,panic和recover是用于处理运行时异常的关键字。以下是它们的用法总结和示例: 1. panic 的作用 触发条件:当程序遇到无法恢复
  • Go中sync.Once源码的深度介绍
    概念 sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次。它在多线程环境中非常有用,尤其是在需要初始化共享资源
  • 基于Go语言实现一个压测工具

    基于Go语言实现一个压测工具
    整体架构 整体系统架构比较简单 通用数据处理模块 Http请求响应数据处理 本项目支持http协议、websocket协议、grpc协议、Remote Authentication Di
  • golang1.23版本之前Timer Reset方法无法正确使用

    golang1.23版本之前Timer Reset方法无法正确使用
    golang1.23 之前 Reset ?到底有什么问题 在golang 的 time.Reset 文档中有这么一句话,为了防止文档更新而导致内容变动,这里粘贴出来: Before Go 1
  • 从源码解析golang Timer定时器体系
    Timer、Ticker使用及其注意事项 在刚开始学习golang语言的时候就听说Timer、Ticker的使用要尤其注意,很容易出现问题,这次就来一探究竟。 本
  • 如何修改Go结构体的私有字段
    文章正文 在 Go 语言中,结构体字段的访问权限是由字段名的首字母决定的:首字母大写表示公共字段(public),首字母小写表示私有字段(
  • Golang实现超时机制读取文件的方法
    协程与通道 协程(Goroutine)是轻量级线程,可实现函数或方法与主程序流并行执行。使用go关键字:go func(){}。通道是协程直接的通讯管道,
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计