返回顶部
首页 > 资讯 > 后端开发 > 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://lsjlt.com/news/30713.html(转载时请注明来源链接)

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

猜你喜欢
  • Go 语言入门之Go 计时器介绍
    目录引言Go 的计时器Ticker 计时器是如何工作的?Ticker 使用方式总结引言 一般来说,很多时候我们面临这样一种情况,即我们需要运行时间记录器,它不断向我们显示当前时...
    99+
    2022-06-07
    GO 计时器
  • Go 语言入门学习之时间包
    目录1.前言2.日期和时间的表示当前时间日期函数如何在Golang中获取当前UNIX的时间戳3.访问时间组件的方法1.前言 时间和日期对于任何编程语言来说都是一个非常重要的包。 GO...
    99+
    2024-04-02
  • Go 语言入门之net/url 包
    目录引言URL 格式Go url 包函数使用格式如何使用 URL 包在 Golang 中对查询字符串进行 URL 编码在 Golang 中对多个查询参数进行 URL 编码在 G...
    99+
    2022-06-07
    net GO url
  • C#语言入门基础介绍
    目录一、.NET 体系结构二、Hello world三、类型和变量四、程序结构前言: C#(读作“See Sharp”)是一种新式编程语言,不仅面向对象,还类型安全。 开发人员利用 ...
    99+
    2024-04-02
  • Go语言从入门到精通:一份简介
    Go语言简介:从入门到精通,需要具体代码示例 引言:在当今动态发展的互联网时代,编程语言的多样性给开发者带来了更多的选择。Go语言,作为一种由Google开发的开源编程语言,以其简洁、高效、强大的特性而受到了...
    99+
    2024-01-23
    Go语言 入门 精通
  • GO语言入门Golang进入HelloWorld
    目录概述Go 语言结构新建项目Hello World概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 1 课) Go 语...
    99+
    2024-04-02
  • 详细介绍Go语言之数组与切片
    目录一、数组1、数组的定义2、数组赋值3、定义并初始化4、数组的大小是类型的一部分5、数组是值类型6、数组长度 len() 数组长度在定义阶段已经固定7、数组循环8、多维数组9、数组...
    99+
    2024-04-02
  • go语言入门要多久
    学习Go语言的入门时间因人而异,取决于个人的学习能力、编程经验以及投入的时间和精力。以下是我对学习Go语言入门所需时间的详细解答:1、学习背景:如果你已经有其他编程语言的基础,比如C、C++、Java等,那么学习Go语言会相对容易一些,因为...
    99+
    2023-10-26
    go语言
  • PHP入门介绍及语言基础
    🌱博客主页:大寄一场. 😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注 目录 前言 一、变量和数据类型 二、运算符和表达式 三、条件语句 四、循环语句 前言 PHP是一种非常流...
    99+
    2023-09-06
    php 开发语言
  • Python 入门基础1 --语言介绍
    本节目录: 一、编程语言介绍 二、python解释器介绍 三、安装python解释器 四.运行python程序的两种方式 五、变量 六、后期补充内容 一、编程语言介绍   1.机器语言:     直接用二进制编...
    99+
    2023-01-30
    入门 语言 基础
  • Go语言七篇入门教程一简介初识
    目录简介为什么是GoGo应用WebCloud 云BlockChain 区块链如何学习Go其实我自己接触Go语言也还不到一年,20年的10月我才开始学Go的。 我自己也并不是很懂,但是...
    99+
    2024-04-02
  • Go语言入门学习之正则表达式
    目录前言什么是正则表达式MatchString 函数Compile 函数MustCompile 函数FindAllString 函数FindAllStringIndex 函数Spli...
    99+
    2024-04-02
  • Go语言入门13之runtime包案例讲解
    目录Runtime包GOMAXPROCS()Gosched()Goexit()举个栗子Runtime包 GOMAXPROCS() ​ 用来设置可以并行计算的CPU核数最大值,并返回之...
    99+
    2023-05-18
    Go runtime包 Go runtime
  • Go语言入门学习之Channel通道详解
    目录前言通道的声明通道的初始化发送和接收数据通道的关闭通道的容量与长度缓冲通道与无缓冲通道双向通道和单向通道遍历通道fibonacci 数列参考文章:总结前言 不同于传统的多线程并发...
    99+
    2024-04-02
  • Go语言指针的详细介绍
    本篇内容介绍了“Go语言指针的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Go语言为程序员提供了...
    99+
    2024-04-02
  • Go语言基础知识点介绍
    Go 语言教程 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thom...
    99+
    2024-04-02
  • Go语言中DateTime的用法介绍
    一、基本使用 ①从属于time这个包 ②一般使用都是使用 time.Time 这个类型表示时间 ,time包中还有一些常量,源码如下 // Common durations. The...
    99+
    2024-04-02
  • Go语言中的Beego框架介绍
    Beego是一个基于MVC架构的Go语言Web框架,它提供了一整套的解决方案来简化Web应用程序的开发。Beego内置了很多功能模块,如路由、ORM、Session等,同时也提供了很多...
    99+
    2024-04-02
  • 如何入门Go语言开发?
    如何入门Go语言开发? Go语言(又称Golang)是一种由Google开发的开源编程语言,它具有快速编译、静态类型、并发编程等特点,适用于开发高性能的后端服务、网络应用、云计算等领域...
    99+
    2024-04-02
  • Go语言编程入门指南
    Go语言(Golang)是由Google开发的一种编程语言,它的设计简洁、高效,并且具有很强的并发特性,因此受到了许多开发者的青睐。本文将为您提供一份简单的Go语言编程入门指南,介绍基...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作