当前位置: 首页 > news >正文

掌握 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.”。

相关文章:

掌握 Go 的计时器

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

嵌入式软件开发笔试面试

C语言部分&#xff1a; 1.gcc的四步编译过程 1.预处理 展开头文件&#xff0c;删除注释、空行等无用内容&#xff0c;替换宏定义。 gcc -E hello.c -o hello.i 2.编译 检查语法错误&#xff0c;如果有错则报错&#xff0c;没有错误则生成汇编文件。 gcc -S hello.i -o h…...

【Qt高阶】Linux安装了多个版本的Qt 部署Qt程序,出包【2023.10.17】

简介 linux系统下可执行程序运行时会加载一些动态库so&#xff0c;有一些是Qt的库&#xff0c;Qt的库会加载其他更基础的库。最后出包的时候需要把依赖的包整理到一个文件夹&#xff0c;来制作安装包。近期遇到已经将依赖的so文件拷贝至程序目录下&#xff0c;但还是调系统路径…...

OpenGL简介

OpenGL 本身并不是一个 API&#xff0c;它仅仅是一个由 Khronos组织 制定并维护的规范&#xff08;Specification&#xff09;。规范严格规定了每个函数该如何执行&#xff0c;以及它们的输出值。至于内部具体每个函数是如何实现的&#xff0c;将由 OpenGL 库的开发者自行决定。…...

持续集成工具jenkins操作

安装Jenkins 下载jenkins安装包 linux上下载jenkins失败 开始在windows上安装jenkins 1、先安装JDK https://jingyan.baidu.com/article/fdbd4277dd90f0b89e3f489f.html 免安装版本JDK只需要解压配置环境变量即可 2、安装Jenkins 参考文档&#xff1a; https://www.cnb…...

使用BurpSuite抓取HTTPS接口

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 原因设置方式 原因 BurpSuite之所以不能抓取https数据包&#xff0c;是因为BurpSuite作为中间人代理&#xff0c;我们和https网站之间的数据通信都是由BurpSuite来…...

移动硬盘被格式化了如何恢复数据?四步教你如何恢复

在日常生活中&#xff0c;我们常常会使用各种存储设备来保存和备份我们的重要数据。移动硬盘作为一种便携式的存储设备&#xff0c;被广泛应用于数据的存储和传输。然而&#xff0c;有时候我们会不小心将移动硬盘格式化&#xff0c;从而丢失了里面的数据。本文将介绍移动硬盘格…...

基于变电站自动化系统中的安全措施分析及应用

摘要&#xff1a;阐述变电运行中的问题&#xff0c;电气自动化系统与安全运行措施&#xff0c;包括自动控制设备的投入&#xff0c;电气自动 化与计算机技术相、设备数据的采集与处理、自动化系统的升级、人工智能技术的应用。 关键词&#xff1a;自动控制&#xff1b;数据采…...

18、监测数据采集物联网应用开发步骤(12.3)

阶段性源码下载 监测数据采集物联网应用开发步骤(12.2) 前端web UI开发 demo 核心代码文件&#xff1a; web/index.html web/index.js web/js/common.js web/init.dlls Web/init.js 程序运行之后在浏览器敲入如下内容访问数据接口&#xff1a; http://localhost:9000…...

什么是Mybatis?Mybaits有哪些优点?

MyBatis是一个开源的Java持久层框架&#xff0c;它可以将Java对象映射到关系型数据库中&#xff0c;同时提供了灵活、高效、易用的数据访问解决方案。 下面是对MyBatis的详细介绍&#xff1a; 1、SQL映射文件 MyBatis使用简单的XML文件或注解配置文件将Java对象映射到数据库…...

点云从入门到精通技术详解100篇-基于3D点云的曲面文字检测(续)

目录 3.2.3 手动特征提取 3.2.4 基于图绘制的 2D 网格平面生成 3.2.5 特征融合的多通道伪图像生成...

用 Java 在 PDF 中创建和管理图层,实现交互式文档

PDF 图层&#xff08;也称为可见图层或附加图层等&#xff09;是组织和管理 PDF 文档中内容可见性的一种方法。PDF 图层可用于创建交互式文档、隐藏或显示特定信息、创建多语言版本文档等。通过添加和删除图层&#xff0c;用户可以根据需要定制 PDF 文档指定内容的可见性与显示…...

公司oa是什么?一般公司oa有什么样功能?

公司OA&#xff08;Office Automation&#xff09;是指通过计算机和信息技术来实现办公自动化的系统。 它提供了一系列的功能和工具&#xff0c;用于协调、管理和处理公司内部的日常事务和流程。OA系统旨在提高工作效率、加强信息交流与共享、简化业务流程&#xff0c;并提供便…...

pytorch里面的 nn.Parameter 和 tensor有哪些异同点

简单来说&#xff0c;你可以把tensor看作是一个通用的数据结构&#xff0c;而nn.Parameter看作是一种特殊的tensor&#xff0c;这种tensor可以被优化以提高模型的性能。在创建模型参数时&#xff0c;你应该使用nn.Parameter而不是直接使用tensor&#xff0c;因为这样可以确保模…...

leetcode 37. 解数独

编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数独部分…...

GIT 分支管理办法

GIT 分支管理办法 一. 大型项目分支管理中存在的痛点 大型项目中需求的上线存在很大的不确定性&#xff0c;而且往往存在多版本、多团队、多开发并行的情况。尤其是大型企业对上线分支中编号的管理十分严苛&#xff0c;严禁夹带上线。这时对于开发而言&#xff0c;没有一个好…...

网络代理的多重应用与安全保障

随着互联网的迅速发展&#xff0c;网络代理技术日益受到关注&#xff0c;并在各个领域展现出重要作用。本文将深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫应用和HTTP协议中的多重应用&#xff0c;帮助读者更好地理解和应用这些关键技术。 1. Socks5代理与SK5代理的异…...

C51--简易报警器设计

硬件清单&#xff1a; C52单片机 震动传感器模块 433M无线发射接受模块 继电器模块 高功率喇叭 杜邦线 振动传感器控制灯&#xff1a; 如何知道是否发生震动&#xff1f;震动后的信号表示又是什么&#xff1f; 振动传感器模块产生震动&#xff0c;输出低电平&#xff0c;绿色指…...

2023年最新全国各省行政区划数据(省-市-区县-乡镇-村)

背景 现实情况&#xff0c;在信息系统开发、电子商务平台、app等等相关软件开发&#xff0c;都会设计到行政区数据联动&#xff0c;这里已经爬好全国各省行政区划数据可供下载。 数据来源 内容为2023年全国统计用区划代码&#xff08;12位&#xff09;和城乡分类代码&#xff…...

html5 web 按钮跳转方法(及其相关)

html5 web 按钮跳转方法&#xff08;及其相关&#xff09; 方法一 <a href"javascript:" οnclick"history.go(-2); ">返回前两页</a> 方法二 <a href"javascript:" οnclick"self.locationdocument.referrer;">返…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...