掌握 Go 的计时器

简介

定时器是任何编程语言的重要工具,它允许开发人员在特定时间间隔安排任务或执行代码。在 Go 中,定时器是通过 time 包实现的,该包提供了一系列功能来创建、启动、停止和有效处理定时器。我们将探索 Go 中定时器的强大功能,并通过代码示例演示如何在应用程序中使用定时器。

创建计时器

要在 Go 中创建一个定时器,我们可以使用 time.NewTimer() 函数,该函数将持续时间作为参数。下面是一个示例:

func CreateTimer() {timer := time.NewTimer(2 * time.Second)fmt.Println("Timer created.")<-timer.C // 阻塞fmt.Println("Timer expired.")
}

在上述代码片段中,我们使用 time.NewTimer() 创建了一个持续时间为 2 秒的新定时器。<-timer.C 语句会阻塞执行,直到定时器过期。定时器到期后,“Timer expired.”(定时器已过期)信息将打印到控制台。

停止计时器

在某些情况下,您可能想在定时器到期前停止它。为此,您可以使用定时器对象的 Stop() 方法。让我们修改之前的示例,加入定时器停止功能:

func StopTimer() {timer := time.NewTimer(2 * time.Second)fmt.Println("Timer created.")go func() {<-timer.Cfmt.Println("Timer expired.")}()time.Sleep(1 * time.Second)stopped := timer.Stop()if stopped {fmt.Println("Timer stopped.")} else {fmt.Println("Timer has already expired.")}
}

在更新后的代码中,我们创建了一个 goroutine 来处理定时器过期,这样就可以在定时器过期前停止它。我们使用 time.Sleep() 函数来模拟在尝试停止计时器之前正在进行的一些工作。最后,我们调用 timer.Stop() 停止定时器。如果定时器已过期,timer.Stop() 返回 false,并打印 “定时器已过期”。否则,我们将打印 “定时器已停止”。

重置计时器

Go 还提供了重置活动定时器的方法。通过 Reset() 方法,您可以更改活动定时器的持续时间,重新开始倒计时。下面是一个示例:

func ResetTimer() {timer := time.NewTimer(10 * time.Second)fmt.Printf("time: %d, Timer created.\n", time.Now().Unix())time.Sleep(2 * time.Second)reset := timer.Reset(3 * time.Second)if reset {fmt.Printf("time: %d, Timer reset.\n", time.Now().Unix())} else {fmt.Printf("time: %d, Timer has already expired.\n", time.Now().Unix())}<-timer.C // 阻塞fmt.Printf("time: %d, Timer expired again.\n", time.Now().Unix())
}

输出为:

time: 1695183503, Timer created.
time: 1695183505, Timer reset.
time: 1695183508, Timer expired again.

在上述代码中,我们创建了一个持续时间为 10 秒的计时器。使用 time.Sleep() 等待 2 秒后,我们调用 timer.Reset(),新的持续时间为 3 秒。如果定时器尚未过期,则重置操作成功,我们将打印 “定时器重置”。否则,进入到 <-timer.C 阻塞阶段,然后打印 我们将打印 “Timer expired again.”。

重置定时器与停止定时器

了解重置定时器和使用 Stop() 停止定时器之间的区别非常重要。

func CompareResetAndStop() {timer := time.NewTimer(5 * time.Second)fmt.Printf("time: %d, Timer created.\n", time.Now().Unix())go func() {<-timer.Cfmt.Printf("time: %d, Timer expired.\n", time.Now().Unix())}()time.Sleep(2 * time.Second)timer.Reset(3 * time.Second)fmt.Printf("time: %d, Timer reset.\n", time.Now().Unix())time.Sleep(2 * time.Second)timer.Stop()fmt.Printf("time: %d, Timer stopped.\n", time.Now().Unix())
}

输出为:

time: 1695183802, Timer created.
time: 1695183804, Timer reset.
time: 1695183806, Timer stopped.

在本例中,我们创建了一个持续时间为 5 秒的计时器。2 秒后,我们使用 timer.Reset() 将计时器重置为 3 秒。之后,再过 2 秒,我们使用 timer.Stop() 停止计时器。重置定时器会改变其持续时间并重新开始倒计时,而停止定时器则会立即停止执行,无论剩余持续时间多长。

带 Ticker 的计时器

Go 提供了一种 Ticker 类型,它是一种专门的定时器,可在指定的时间间隔内重复触发。定时器可用于定期执行任务。

func Tick() {ticker := time.NewTicker(1 * time.Second)defer ticker.Stop()go func() {for range ticker.C {fmt.Printf("time: %d, Ticker ticked!\n", time.Now().Unix())}}()time.Sleep(5 * time.Second)
}

在本例中,我们使用 time.NewTicker() 创建了一个持续时间为 1 秒的 Ticker。然后,我们启动一个 goroutine,从 ticker.C channel 接收值,每当滴答声响起时,goroutine 就会发出一个值。在 goroutine 中,每次接收到一个 tick 时,我们都会打印 “Ticker ticked!”。调用 time.Sleep() 可以让滴答滴答运行 5 秒钟,然后退出程序。

使用 Select 的超时

Go 的 select 语句允许在多个通道上执行非阻塞操作。这可以用来使用计时器实现超时。

func TimeOut() {ch := make(chan string)go func() {time.Sleep(2 * time.Second)ch <- "Operation completed."}()select {case msg := <-ch:fmt.Println(msg)case <-time.After(1 * time.Second):fmt.Println("Timeout reached.")}
}

在本例中,我们创建了一个 channel ch,并启动一个 goroutine 来模拟耗时 2 秒的操作。我们使用 select 语句从 ch 接收信息,或使用 time.After() 等待超时。如果操作在 1 秒内完成,则打印消息。否则,将执行超时情况,并打印 “Timeout reached.”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios发送常见请求方式以及拦截器的封装

一&#xff0c;常见请求 //1.get--传递paramsaxios.get("/test",{params:{}})//2.post--传递paramsaxios.post("/test",{},{params:{}}) //3.post--传递bodyaxios.post("/test",{name:""}) 二&#xff0c;封装请求拦截器 import ax…

[AutoSAR系列] 1.2 AutoSar 综述

AutoSAR是一种汽车工业领域的标准化软件架构,旨在简化不同汽车制造商之间的软件开发和交互。该标准于2003年由一系列欧洲汽车制造商成立的AutoSAR联盟制定并发布,目前已经成为全球范围内的标准。下面将对AutoSAR的概念、架构和实现进行综述。 1. 概述 AutoSAR是汽车电子控制…

全球3小时气象数据集GLDAS Noah Land Surface Model L4 3 hourly 0.25 x 0.25 degree V2.1

简介 全球3小时气象数据集&#xff08;GLDAS Noah Land Surface Model L4 3 hourly 0.25 x 0.25 degree V2.1&#xff0c;简称GLDAS_NOAH025_3H 2.1&#xff09;&#xff0c;时空分辨率分别为3小时、0.25度。该数据产品于2020年1月重新处理&#xff0c;代替之前版本。前言 – …

npm ERR! exited with error code: 128

1.遇到的问题 报错信息&#xff1a;npm ERR! E:\tools\Gitt\Git\cmd\git.EXE ls-remote -h -t https://github.com/nhn/raphael.git npm ERR! npm ERR! fatal: unable to access https://github.com/nhn/raphael.git/: OpenSSL SSL_read: Connection was reset, errno 10054 …

Python-嗨格式 之音频转换,ncm转mp3

缘由&#xff1a;本想下载一些歌到车机播放&#xff0c;发现大部分是ncm格式的。 查了下才知道是音乐软件限制了&#xff0c;会员下载的音频文件为.ncm格式&#xff0c;目前只能在网易云音乐APP上播放&#xff0c;不支持在其他音频播放软件或音频设备使用。 百度转换软件&…

vscode使用CSScomb插件

1. 安装 在设置中搜索csscomb&#xff0c;把Csscomb: Format On Save勾上 然后去edit in settings.json配置 2.使用 2.1 用官网提供的三种方法 https://github.com/csscomb/csscomb.js/tree/master/config 2.2 自定义 CSS 书写顺序规则可以参考这个荐腾讯 AollyTeam 团队的…

【六:(mock数据)spring boot+mybatis+yml】

目录 1.1、代码编写Demo类User类启动类 APplication 1.2、配置类查询语句的配置 mysql.ymlspringboot的配置 application.yml日志的配置 logback.xml数据库的配置 mybatis-config.xml 1.3、测试&#xff1a;1.3.1、测试获取用户数1.3.2、添加用户1.3.3、数据的更新1.3.4、数据的…

阿里云今年有双十一活动吗?不好说

阿里云今年有双十一活动吗&#xff1f;不好说&#xff0c;因为去年就没有。阿里云双11优惠活动是一项大型的促销活动&#xff0c;每年都有&#xff0c;但是去年没有双十一活动&#xff0c;不知道今年2023年阿里云是否有双11优惠活动。但是阿里云百科aliyunbaike.com猜想&#x…

uni-app:js二维数组与对象数组之间的转换

一、二维数组整理成对象数组 效果 [ ["前绿箭","DI10","RO1"], ["前红叉","DI2","RO2"], ["后绿箭","DI12","RO3"], ["后红叉","DI4","RO6"] ] …

ES6 Generator 函数

Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;语法行为与传统函数完全不同。 形式上&#xff0c;Generator 函数是一个普通函数&#xff0c;但是有两个特征。一是&#xff0c;function关键字与函数名之间有一个星号&#xff1b;二是&#xff0c;函数体内部使用…

STM32基于HAL库RT-Thread Demo测试

STM32基于HAL库RT-Thread Demo测试 &#x1f388;源码地址&#xff1a;https://github.com/RT-Thread/rt-thread/tree/master&#x1f4cc;基于STM32CUBEMX中间件安装《基于 CubeMX 移植 RT-Thread Nano》&#x1f4cd;环境搭建《使用 Env 创建 RT-Thread 项目工程》&#x1f5…

操作系统知识点学习

操作系统 一、什么是操作系统&#xff1f;请简要概述一下 操作系统是管理计算机硬件和软件资源的计算机程序&#xff0c;提供一个计算机用户与计算机硬件系统之间的接口。向上对用户程序提供接口&#xff0c;向下接管硬件资源。操作系统本质上也是一个软件&#xff0c;作为最接…

ChessGPT:免费好用的国际象棋对弈AI机器人

对于国际象棋初学者&#xff0c;需要找一个对手来练棋。ChessGPT&#xff0c;就是一个免费好用的AI对弈机器人&#xff0c;非常适合新手来提升&#xff0c;是一个很好的练习伙伴。网站地址是&#xff1a;https://www.chess.com/play/computer&#xff0c;也有手机版app&#xf…

【RocketMQ系列五】消息示例-顺序消息延迟消息广播消息的实现

1. 前言 上一篇文章我们介绍了简单消息的实现&#xff0c;本文将主要来介绍顺序消息的实现&#xff0c;顺序消息分为局部顺序消息和全局顺序消息。 顺序消息指的是消费者在消费消息时&#xff0c;按照生产者发送消息的顺序进行消费。即先发送的先消费【FIFO】。 顺序消息分为…

避免创建不必要的对象

1、一般来说,最好能重用对象而不是每次需要的时候就创建一个功能相同的新对象 先看一个反例,如下所示: String s = new String("No way"); 该语句每次被执行都会创建一个新的String实例。传递给String构造器的参数"No way"本身就是一个String实例,功…

设计模式-装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种设计模式&#xff0c;它允许在运行时动态地给一个对象添加额外的功能&#xff0c;而不需要修改原始对象的结构。 在Java中&#xff0c;装饰器模式可以通过以下方式实现&#xff1a; 1. 创建一个接口…

从实时数据库转战时序数据库,他陪伴 TDengine 从 1.0 走到 3.0

关于采访嘉宾 在关胜亮的学生时代&#xff0c;“神童”这个称号如影随形&#xff0c;很多人初听时会觉得这个称谓略显夸张&#xff0c;有些人还会认为这是不是就是一种调侃&#xff0c;但是如果你听说过他的经历&#xff0c;就会理解这一称号的意义所在了。 受到教师母亲的影…

处理sass-loader安装失败

Vue项目中安装node-sass跟sass-loader 我们在开发中,经常会使用sass语法来编写css&#xff0c;在安装node-sass和sass-loader时&#xff0c;经常会出现错误&#xff08;通常是依赖冲突&#xff09;导致安装失败。因为官方发布的版本号并不是连续的&#xff0c;有些版本与版本之…

【ssh_config】SSH中配置多个private key

当要使用多个不同的private key登录不同的主机时&#xff0c;我们可以在ssh命令里面用-i参数指定每次使用的private key文件。 但是这样做比较发麻而且容易出错&#xff0c;我们可以利用~/.ssh/config文件&#xff0c;在让ssh自动为我们决定应该使用哪个key。 基本方法 最简单…

ESRI ArcGIS Desktop 10.8.2图文安装教程及下载

ArcGIS 是由美国著名的地理信息系统公司 Esri 开发的一款地理信息系统软件&#xff0c;它是目前全球最流行的 GIS 软件之一。ArcGIS 提供了图形化用户界面和数据分析工具&#xff0c;可以帮助用户管理、分析和可视化各种空间数据。ArcGIS Desktop是一个完整的桌面GIS软件套件&a…