广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go 语言入门之Go 计时器介绍
  • 525
分享到

Go 语言入门之Go 计时器介绍

GO计时器 2022-06-07 20:06:15 525人浏览 八月长安
摘要

目录引言Go 的计时器Ticker 计时器是如何工作的?Ticker 使用方式总结引言 一般来说,很多时候我们面临这样一种情况,即我们需要运行时间记录器,它不断向我们显示当前时

目录

引言

Go 的计时器

Ticker 计时器是如何工作的?

Ticker 使用方式

总结

引言

一般来说,很多时候我们面临这样一种情况,即我们需要运行时间记录器,它不断向我们显示当前时间或在给定的时间间隔内保持执行一定的代码和平,在这种情况下,我们应该使用 ​

​Ticker​
​​,使用这个我们需要使用 go 语言的 ​
​time​
​​ 包,我们有一个名为 ​
​NewTicker()​
​​ 的方法,它允许我们停止和启动时间代码,我们需要通过传递 ​
​chan​
​​ 和 ​
​bool​
​ 作为将使用的参数来创建一个代码通道检查它是否打开,如果通道打开意味着计时器将继续。

Go 的计时器

Go 提供了非常简单的语法来实现一个计时器,定时器的结构体定义:

type Ticker struct {
C <-chan Time // 抛出来的channel,给上层系统使用,实现计时
r runtimeTimer // 给系统管理使用的定时器,系统通过该字段确定定时器是否到时,如果到时,调用对应的函数向C中推送当前时间。
}

Ticker对外仅暴露一个 channel,指定的时间到来时就往该 channel 中写入系统时间,也即一个事件。

Ticker 的使用方式也很简单,代码如下:

import time
TimeTicker := time.NewTicker(1 * time.Second)
TimeTicker.Stop()

​time​
​​ : 如果想要使用​
​time​
​ 中的计时器,那么需要将其导入代码中

​NewTicker()​
​​ 函数:这个很好理解,新建一个计时器,然后该计时器以时间表达式作为参数,比如一秒​
​1*time.Second​
​​ ,而不是直接传入​
​1​
​​ ,也可以传入其他时间方式,比如​
​2*time.Millisecond​

最后,我们可以使用时间表达式调用由​

​NewTicker​
​​ 函数创建的变量上的任何活动。例如,在上面的语法中,我们使用了​
​TimeTicker.Stop()​
​​ 来停止时间计时器。我们可以在特定条件下使用它,比如定义倒数 10 秒的计时器,就可以检查时间是否满足 10 秒,一旦 10 秒发生,我们可以调用​
​TimeTicker.stop()​
​。

我们可以每隔一秒输出一个结果,比如实现一个倒数 10 个数的功能:

package main
import (
"fmt"
"time"
)
func main() {
TimeTicker := time.NewTicker(1 * time.Second)
i := 10
for {
<-TimeTicker.C
fmt.Println("i = ", i)
i--
if i == 0 {
TimeTicker.Stop()
break
}
}
}

然后执行该程序:

$ go run main.go
i = 10
i = 9
i = 8
i = 7
i = 6
i = 5
i = 4
i = 3
i = 2
i = 1

Ticker 计时器是如何工作的?

​NewTicker​
​​创建的计时器与​
​NewTimer​
​​创建的计时器持有的时间​
​channel​
​​一样都是带一个缓存的​
​channel​
​​,每次触发后执行的函数也是​
​sendTime​
​​,这样即保证了无论有误接收方​
​Ticker​
​触发时间事件时都不会阻塞:

func NewTicker(d Duration) *Ticker {
if d <= 0 {
panic(errors.New("non-positive interval for NewTicker"))
}
// Give the channel a 1-element time buffer.
// If the client falls behind while reading, we drop ticks
// on the floor until the client catches up.
c := make(chan Time, 1)
t := &Ticker{
C: c,
r: runtimeTimer{
when: when(d),
period: int64(d),
f: sendTime,
arg: c,
},
}
startTimer(&t.r)
return t
}

NewTicker()只是构造了一个Ticker,然后把Ticker.r通过startTimer()交给系统协程维护。

其中

period
为事件触发的周期。

其中​

​sendTime()​
​方法便是定时器触发时的动作:

func sendTime(c interface{}, seq uintptr) {
select {
case c.(chan Time) <- Now():
default:
}
}

​sendTime​
​ 接收一个管道作为参数,其主要任务是向管道中写入当前时间。

停止Ticker:

停止

Ticker
,只是简单的把Ticker从系统协程中移除。

函数主要实现如下:

func (t *Ticker) Stop() {
stopTimer(&t.r)
}

​stopTicker()​
​ 即通知系统协程把该 Ticker 移除,即不再监控。系统协程只是移除 Ticker 并不会关闭管道,以避免用户协程读取错误。

Ticker 使用方式

例子一:

package main
import (
"fmt"
"time"
)
func main() {
TimeTicker := time.NewTicker(3 * time.Second)
tickerChannel := make(chan bool)
go func() {
for {
select {
case timeticker := <-TimeTicker.C:
fmt.Println("The time for current is : ", timeticker)
case <-tickerChannel:
return
}
}
}()
time.Sleep(6 * time.Second)
TimeTicker.Stop()
tickerChannel <- true
fmt.Println("Time for running ticker is completed")
}

运行该代码:

$ go run main.go
The time for current is : 2022-04-29 22:37:13.93862 +0800 CST m=+3.000267823
The time for current is : 2022-04-29 22:37:16.939081 +0800 CST m=+6.000707515
Time for running ticker is completed

例子二:

package main
import (
"fmt"
"time"
)
func main() {
tm := time.Millisecond
tickerTicker := time.NewTicker(400 * tm)
tickerChaneel := make(chan bool)
go func() {
for {
select {
case <-tickerChaneel:
return
case tmtr := <-tickerTicker.C:
fmt.Println("Ticker time at current is", tmtr)
}
}
}()
time.Sleep(1400 * time.Millisecond)
tickerTicker.Stop()
tickerChaneel <- true
fmt.Println("Ticker has stopped now")
}

运行该代码:

$ go run main.go
Ticker time at current is 2022-04-29 22:39:51.13057 +0800 CST m=+0.400159916
Ticker time at current is 2022-04-29 22:39:51.531516 +0800 CST m=+0.801102997
Ticker time at current is 2022-04-29 22:39:51.931238 +0800 CST m=+1.200822301
Ticker has stopped now

总结

本文简单了解了 go 计时器 ​

​Ticker​
​​ 的基本概念,介绍了它的工作原理,并且我们专注于 go 语言中 ​
​ticker​
​ 的语法和使用。最后展现了 go 语言中的一些重要示例。

到此这篇关于Go 语言入门之Go 计时器介绍的文章就介绍到这了,更多相关Go计时器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!


您可能感兴趣的文档:

--结束END--

本文标题: Go 语言入门之Go 计时器介绍

本文链接: https://www.lsjlt.com/news/30713.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 语言入门之Go 计时器介绍
    目录引言Go 的计时器Ticker 计时器是如何工作的?Ticker 使用方式总结引言 一般来说,很多时候我们面临这样一种情况,即我们需要运行时间记录器,它不断向我们显示当前时...
    99+
    2022-06-07
    GO 计时器
  • Go 语言入门学习之时间包
    目录1.前言2.日期和时间的表示当前时间日期函数如何在Golang中获取当前UNIX的时间戳3.访问时间组件的方法1.前言 时间和日期对于任何编程语言来说都是一个非常重要的包。 GO...
    99+
    2022-11-13
  • Go 语言入门之net/url 包
    目录引言URL 格式Go url 包函数使用格式如何使用 URL 包在 Golang 中对查询字符串进行 URL 编码在 Golang 中对多个查询参数进行 URL 编码在 G...
    99+
    2022-06-07
    net GO url
  • 详细介绍Go语言之数组与切片
    目录一、数组1、数组的定义2、数组赋值3、定义并初始化4、数组的大小是类型的一部分5、数组是值类型6、数组长度 len() 数组长度在定义阶段已经固定7、数组循环8、多维数组9、数组...
    99+
    2022-11-12
  • Go语言七篇入门教程一简介初识
    目录简介为什么是GoGo应用WebCloud 云BlockChain 区块链如何学习Go其实我自己接触Go语言也还不到一年,20年的10月我才开始学Go的。 我自己也并不是很懂,但是...
    99+
    2022-11-12
  • Go语言入门学习之正则表达式
    目录前言什么是正则表达式MatchString 函数Compile 函数MustCompile 函数FindAllString 函数FindAllStringIndex 函数Spli...
    99+
    2022-11-13
  • Go语言入门学习之Channel通道详解
    目录前言通道的声明通道的初始化发送和接收数据通道的关闭通道的容量与长度缓冲通道与无缓冲通道双向通道和单向通道遍历通道fibonacci 数列参考文章:总结前言 不同于传统的多线程并发...
    99+
    2022-11-13
  • Go语言入门13之runtime包案例讲解
    目录Runtime包GOMAXPROCS()Gosched()Goexit()举个栗子Runtime包 GOMAXPROCS() ​ 用来设置可以并行计算的CPU核数最大值,并返回之...
    99+
    2023-05-18
    Go runtime包 Go runtime
  • Go语言入门之函数的定义与使用
    目录1.前言2.函数声明2.1 函数例子2.2 Go 函数支持多返回值2.3 变量函数2.4 闭包2.5 递归3.总结1.前言 函数是一段代码的片段,包含连续的执行语句,它可以将零个...
    99+
    2022-11-11
  • Go语言基础入门应用简介及常用命令
    目录Go语言简介Go语言的主要特点【重点】Go语言应用Go语言中常用命令Go语言中可见性规则【重点】 Go语言简介 Go 是一门开源、支持并发、垃圾回收的编译型系统编程语言从 200...
    99+
    2022-11-12
  • Go语言中定时任务库Cron使用方法介绍
    目录快速入门Cron表达式格式预定义时间表设置时区常用的方法介绍快速入门 安装cron,注意这里安装的是v3版本。新版本和旧版时间使用有所区别 go get github.com/r...
    99+
    2022-11-13
  • 介绍Go语言的设计与实现及Github开源项目
    Go语言设计与实现Github近年来,随着Web应用的快速发展和云计算的广泛应用,Go语言已成为众多开发者的首选。作为一门静态类型编程语言,Go语言在编译速度、并发能力、代码可读性等方面优势明显,因此备受关注。本文将介绍Go语言的设计与实现...
    99+
    2023-10-22
  • GO语言入门学习之基本数据类型字符串
    目录字符串字符串转义符byte和rune类型修改字符串类型转换总结字符串 Go语言中的字符串以原生数据类型出现。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引...
    99+
    2022-11-13
  • go语言代码生成器code generator使用示例介绍
    目录代码生成器介绍code-generator示例代码生成tag全局tag局部tag补充代码生成器介绍 client-go为每种k8s内置资源提供了对应的clientset和info...
    99+
    2022-11-13
  • go语言分布式id生成器及分布式锁介绍
    目录分布式 id 生成器worker_id 如何分配开源示例:标准雪花算法分布式锁进程内加锁尝试加锁 tryLock基于 Redis 的 setnx 分布式锁基于 ZooKeeper...
    99+
    2023-05-14
    go 分布式id生成器 锁 go 分布式锁
  • Go语言容器重定向详解:从入门到精通
    容器化技术已经成为了现代软件开发的标配,而Go语言作为一门高效、简洁的编程语言,也在容器化领域中发挥着越来越重要的作用。其中,容器重定向是Go语言中一个重要的概念。本文将从入门到精通地介绍Go语言容器重定向的相关知识。 一、什么是容器重定...
    99+
    2023-10-19
    容器 重定向 教程
  • Go语言容器重定向入门:从零开始学习
    在容器技术的世界中,容器的重定向技术被广泛运用。重定向技术可以让容器内的进程能够与宿主机的标准输入、输出、错误输出等进行交互。在本文中,我们将从零开始学习Go语言容器重定向的入门知识,为读者提供一些实用的代码示例。 一、Go语言中的重定向...
    99+
    2023-10-19
    容器 重定向 教程
  • 一文带你入门Go语言中定时任务库Cron的使用
    目录前言快速开始安装导入DemoCron表达式格式标准格式预定义时间表常用的方法介绍new()AddJob()AddFunc()Start()相关推荐Go第三方库之cronexpr&...
    99+
    2022-11-11
  • 从入门到实战,GO语言实时开发技术学习笔记分享
    GO语言是由Google公司开发的一种高效、简洁、快速的编程语言,同时也是一门静态类型的语言。它的语法简洁易懂,拥有自动垃圾回收机制,同时支持并发编程,因此非常适合用于实时开发领域。本文将分享我在学习GO语言实时开发技术时的笔记和心得,希...
    99+
    2023-11-12
    实时 开发技术 学习笔记
  • 利用Go语言开发上门做菜系统的配送时间预约功能有哪些创新之处?
    随着社会的不断发展,人们对于生活品质和便捷性的要求也越来越高。在这样的背景下,家庭餐饮服务越来越受到人们的关注,特别是上门做菜服务成为了不少人的选择。然而,如何提高上门做菜服务的效率和质量,成为了一个需要解决的问题。在这方面,利用Go语言开...
    99+
    2023-11-01
    Go语言 上门做菜系统 配送时间预约
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作