首页 > 其他分享 >Golang初学:time包,Ticker,Timer

Golang初学:time包,Ticker,Timer

时间:2024-05-13 22:31:54浏览次数:24  
标签:2024 13 21 0800 Timer Golang time CST Ticker

go version go1.22.1 windows/amd64

Windows 11 + amd64

x86_64 x86_64 GNU/Linux

---

 

序章

package time

https://pkg.go.dev/time

Package time provides functionality for measuring and displaying time.

测量、显示 时间。

 

本文展示 Ticker、Timer 的 基本使用。

 

type Ticker

源码:

// A Ticker holds a channel that delivers “ticks” of a clock
// at intervals.
type Ticker struct {
	C <-chan Time // The channel on which the ticks are delivered.
	r runtimeTimer
}

通过 这里的 C(只读通道) 接收 tick 数据。

相关方法:

// 函数:创建
func NewTicker(d Duration) *Ticker

// 方法:
// 重置 间隔时间
func (t *Ticker) Reset(d Duration)
// 停止
func (t *Ticker) Stop()

 

创建

1、time.Tick 函数 不推荐。

示例:

tk := time.Tick(3 * time.Second)

VS code 此时显示:

using time.Tick leaks the underlying ticker,

consider using it only in endless functions, tests and the main package, and use time.NewTicker here (SA1015)

2、time.NewTicker 推荐。

// 示例
tkptr := time.NewTicker(2 * time.Second)

// 函数签名
func NewTicker(d Duration) *Ticker

 

测试

建立一个 2秒 为周期的 Ticker,循环接收数据,在第5次时,重置(Reset)周期为 5m秒。

代码:

func testNewTicker() {
	tkptr := time.NewTicker(2 * time.Second)
    // 重要
	defer tkptr.Stop()
    
	for i := range [10]int{} {
		tktime := <-tkptr.C
		fmt.Println(i, tktime)

		if i == 4 {
            // 重置
			fmt.Println("call Reset to 5s...")
			tkptr.Reset(5 * time.Second)
		}

		//if i == 7 {
		//	tkptr.Stop()
		//}
	}
	fmt.Println("end.")
}

测试结果:

0 2024-05-13 21:17:29.5750291 +0800 CST m=+2.039318301
1 2024-05-13 21:17:31.5746698 +0800 CST m=+4.038959001
2 2024-05-13 21:17:33.564633 +0800 CST m=+6.028922201
3 2024-05-13 21:17:35.5707819 +0800 CST m=+8.035071101
4 2024-05-13 21:17:37.5620536 +0800 CST m=+10.026342801
call Reset to 5s...
5 2024-05-13 21:17:42.576125 +0800 CST m=+15.040414201
6 2024-05-13 21:17:47.5726813 +0800 CST m=+20.036970501
7 2024-05-13 21:17:52.5662796 +0800 CST m=+25.030568801
8 2024-05-13 21:17:57.5647188 +0800 CST m=+30.029008001
9 2024-05-13 21:18:02.5788418 +0800 CST m=+35.043131001
end.

符合预期。

 

补充说明:

i == 7  的3行,测试了 Stop 方法。打开注释,程序会出现错误“fatal error: all goroutines are asleep - deadlock!”。

此时,应该在 Stop() 后 跳转(goto)到结束。

 

type Timer

源码:

type Timer struct {
	C <-chan Time
	r runtimeTimer
}

也有一个 只读通道 C。

相关方法:

// 函数
// 周期到达后,执行函数 f
func AfterFunc(d Duration, f func()) *Timer
// 标准新建
func NewTimer(d Duration) *Timer
// 方法
// 重置
func (t *Timer) Reset(d Duration) bool
// 停止:在 到达前停止才有意义
func (t *Timer) Stop() bool

 

创建

time.NewTimer 函数:
// 示例
tptr := time.NewTimer(4 * time.Second)

 

测试

代码:

// NewTimer
func testTimer1() {
	fmt.Println("start.", time.Now())
	tptr := time.NewTimer(4 * time.Second)
	defer tptr.Stop()

	t1 := <-tptr.C
	fmt.Println("t1=", t1)

	// 再次调用 出错
	// fatal error: all goroutines are asleep - deadlock!
	// t2 := <-tptr.C
	// fmt.Println(t2)

	// Reset
	// 重置后可以再使用
	tptr.Reset(8 * time.Second)
	t3 := <-tptr.C
	fmt.Println("t3=", t3)

	fmt.Println("end.")
}

测试结果:

start. 2024-05-13 21:47:31.2810254 +0800 CST m=+0.024694601
t1= 2024-05-13 21:47:35.2948188 +0800 CST m=+4.038488001
t3= 2024-05-13 21:47:43.3031721 +0800 CST m=+12.046841301
end.

符合预期。

 

AfterFunc 的简单示例:

func testAfterFunc() {
	tptr := time.AfterFunc(3*time.Second, func() {
		fmt.Println("call f.", time.Now())
	})
	defer tptr.Stop()

    // 4s 大于 tptr 的 3秒
	fmt.Println("停止4s:")
    // 两种方法 暂停
	// 1. ok
	// s4 := <-time.After(4 * time.Second)
	// fmt.Println("s4=", s4)
	// 2. ok
	time.Sleep(4 * time.Second)

	fmt.Println("end.")
}

测试结果:

start. 2024-05-13 21:50:46.199039 +0800 CST m=+0.025212501
停止4s:
call f. 2024-05-13 21:50:49.2040232 +0800 CST m=+3.030196701
end.

 

END.

ben发布于博客园

本文链接:

https://www.cnblogs.com/luo630/p/18190037

ben发布于博客园

参考资料

1、

 

ben发布于博客园

ben发布于博客园

 

标签:2024,13,21,0800,Timer,Golang,time,CST,Ticker
From: https://www.cnblogs.com/luo630/p/18190037

相关文章

  • golang进程通过共享内存和C++进程进行通信
    目录serverclientserverC++可以使用POSIX共享内存API来创建和管理共享内存server.cpp#include<fcntl.h>#include<sys/mman.h>#include<sys/stat.h>#include<unistd.h>#include<cstring>#include<iostream>constchar*S......
  • golang 压缩包解压问题汇总
    解压代码packagemainimport( "archive/zip" "bytes" "fmt" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" "io" "io/ioutil" "os" "path/......
  • golang channel 封装
    对于closed或nil通道,规则如下:无论收发,nil通道都会阻塞。不能关闭nil通道。重复关闭通道,引发panic!向已关闭通道发送数据,引发panic!从已关闭通道接收数据,返回缓冲数据或零值。nil通道是指没有make的变量。鉴于通道关闭后,所有基于此的阻塞都被解除,可用作通知。没......
  • LwRB - 一款适用嵌入式系统的轻量级 RingBuffer+MultiTimer - 超精简的纯软件定时器驱
    1、MicroMagic发布世界上最快的64-bitRISC-V核近日,一家位于美国加州森尼维尔的小型电子设计公司MicroMagic宣称设计、生产出了全世界最快的64位RISC-V内核,比苹果的M1芯片和ArmCortex-A9表现还要出色。消息源: http://www.micromagic.com/news/RISCv-Fastest_PR.pdf这......
  • 【golang】go语言学习需要注意的点
     (学习可参考菜鸟教程:https://www.runoob.com/go/go-basic-syntax.html) 1.Go编译生成的exe程序在后台运行(不闪过console窗口)gobuild-ldflags"-s-w-H=windowsgui"-s省略符号表和调试信息-wOmittheDWARFsymboltable省略DWARF符号表-Hwindowsgui不打印信......
  • 【Azure Function】Azure Function中的Timer Trigger无法自动触发问题
    问题描述在AzureFunction中,部署了定时触发器函数(TimerTrigger),却无法按时触发。 问题解答登录Function的Kudu站点,查看logfiles中application/function/host目录下的日志文件,发现错误消息:Singletonlockrenewalfailedforblob'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx......
  • golang项目包管理(go module模式)
     修改GO111MODULE和GOPROXYexportGO111MODULE=onexportGOPROXY=https://goproxy.io#GO111MODULE默认为auto,当项目存在go.mod,会自动启用gomodule模式。这里还是直接开启比较好。初始化go.modgomodinit安装依赖goget依赖包#下载的依赖包放在GOPATH下pkg下的m......
  • Golang gin 框架使用 MongoDB 进行多表联查,以及分组查询
    主要针对gin框架中如何使用假设两张表order表{"_id":ObjectId("65aa2b2203abce203bbe3c7a"),"name":"骆驼祥子","route":"/test/v2/desktop","bookshelf":"03"}orderRemark表{......
  • golang生成二维码图片,支持图片下方增加多行居中文本
    golang生成二维码图片,支持图片下方增加多行居中文本效果工具类代码packageUtilsimport( "bytes" "fmt" "github.com/golang/freetype/truetype" "github.com/skip2/go-qrcode" "golang.org/x/image/font" "golang.org/x/image/math......
  • golang 获得一个结构体的字节大小
    golang的内存占用是如何构成的呢?unsafe.SizeOf()转载:如何在Go中获取变量的内存大小?--CSDN问答如果传递一个未初始化的变量,unsafe.Sizeof()与reflect.Type.Size()将只返回传递的变量的类型的大小,并不递归地遍历数据结构并增加所指向变量的大小。切片是一个相对简单的结构体st......