定时器

type Timer struct {C<-chan Timer runtimeTimer
}

Timer

一个定时器,代表未来的一个单一事件,你可以告诉timer你要等待多长时间,它提供一个channel,在将来的那个时间channel提供了一个时间值

延时

time.NewTimer时间到了,只响应一次

func main() {//time.NewTimer时间到了,只响应一次//创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间)timer := time.NewTimer(2 * time.Second)fmt.Println("当前时间: ", time.Now())//2s后,往timer.c写数据,有数据后,就可以读取t := <-timer.C //channel没有数据前后阻塞fmt.Println("t = ", t)
}

time.After(2 * time.Second)延迟多少秒产生个事件

func main() {//定时2秒,2秒后产生一个事件,往channel里面写内容<-time.After(2 * time.Second)fmt.Println("时间到")
}

停止

关闭定时器,定时器就不起作用了

func main() {timer := time.NewTimer(3 * time.Second)go func() {<-timer.Cfmt.Println("子协程可以打印了,因为定时器的时间到了")}()//关闭定时器timer.Stop()for {}
}

重置

func main() {timer := time.NewTimer(3 * time.Second)//重置上面的那个无效flag := timer.Reset(1 * time.Second)fmt.Println(flag)  //true<-timer.Cfmt.Println("时间到")
}

Ticker

定时触发的计时器,它会以一个间隔(interval)往channel发送一个事件(当前时间),而channel的接收者可以以固定的时间间隔从channel中读取事件

func main() {ticker := time.NewTicker(1 * time.Second)i := 0for {<-ticker.Ci++fmt.Println("i = ", i)if i ==5 {//停止tickerticker.Stop()break}}
}

不断取出数据

intChan2 := getIntChan()
for elem := range intChan2 {fmt.Printf("The element in intChan2: %v\n", elem)
}

我把调用getIntChan得到的结果值赋给了变量intChan2,然后用for语句循环地取出了该通道中的所有元素值,并打印出来。

这里的for语句也可以被称为带有range子句的for语句。它的用法我在后面讲for语句的时候专门说明。现在你只需要知道关于它的三件事。

一、这样一条for语句会不断地尝试从intChan2种取出元素值,即使intChan2被关闭,它也会在取出所有剩余的元素值之后再结束执行。

二、当intChan2中没有元素值时,它会被阻塞在有for关键字的那一行,直到有新的元素值可取。

三、假设intChan2的值为nil,那么它会被永远阻塞在有for关键字的那一行。

这就是带range子句的for语句与通道的联用方式。不过,它是一种用途比较广泛的语句,还可以被用来从其他一些类型的值中获取元素。除此之外,Go 语言还有一种专门为了操作通道而存在的语句:select语句

golang中的定时器相关推荐

  1. Golang中WaitGroup、Context、goroutine定时器及超时学习笔记

    原文连接:http://targetliu.com/2017/5/2... 好久没有发过文章了 - -||,今天发一篇 golang 中 goroutine 相关的学习笔记吧,以示例为主. WaitG ...

  2. golang延时_Golang 定时器底层实现深度剖析

    本文将基于 Golang 源码对 Timer 的底层实现进行深度剖析.主要包含以下内容: 1. Timer 和 Ticker 在 Golang 中的底层实现细节,包括数据结构等选型. 2. 分析 ti ...

  3. Golang当中的定时器

    定时器 前言 定时器的基本使用 前言 在平时写代码的时候,我们经常会遇到在将来某个时间点或者间隔一段时间重复执行函数.这个时候我们就可以考虑使用定时器.本片文章主要介绍一下golang当中的几个常用的 ...

  4. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

  5. 如何在golang中关闭bufio.reader_Golang 并发模型系列:1. 轻松入门流水线模型

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...

  6. java怎么加定时器_JAVA WEB程序中添加定时器

    JAVA WEB程序中添加定时器 //这是我的定时器类,用来定时执行某段任务: package com.my.time; import java.text.ParseException; import ...

  7. go语言的iota是什么意思_关于Golang中的iota

    快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...

  8. Golang中的panic和recover(捕获异常)

    Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...

  9. golang 中string和int类型相互转换

    总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: test_int, err := strconv.Atoi(test_string) if err != ni ...

最新文章

  1. leetcode每日一题系列——797. 所有可能的路径
  2. 20145129 《Java程序设计》第6周学习总结
  3. 天鹅给癞蛤蟆的回信[转贴]
  4. 小功能隐藏着大学问---windows的ACL带来的挑战
  5. 2021HDU多校8 - 7059 Counting Stars(线段树)
  6. 为何采用双亲委派机制
  7. Android小数和整数相互转换
  8. c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...
  9. CloudIDE插件在手,按时下班不愁
  10. bzoj1853幸运数字——容斥原理
  11. PE接受失败:一场被迫发生的行业革命
  12. 【大云制造】公有云产品及解决方案V4.0——全新面貌,重新出发
  13. 电脑键盘下划线怎么打_苹果电脑键盘失灵怎么办,维护方法!
  14. ILRuntime入门11 LitJson
  15. java线性规划_线性规划的代码实现
  16. K8S 数据卷volumes之ConfigMap
  17. Contour Features 边界特征
  18. 网站推广(百度百科)
  19. Ubuntu18.04打开优化设置界面
  20. Linux下配置C语言编程环境

热门文章

  1. 【Visual Studio 2019】上传代码到 GitHub ( 16.9.2 版本 | 安装 GitHub 扩展插件 | 创建 Git 仓库 | 推送到远程仓库 )
  2. 逃亡的准备(大数据版)
  3. Windows cmd 快捷操作
  4. redis集群之哨兵模式【原】
  5. Protocol Buffer搭建及示例
  6. Express调用mssql驱动公共类dbHelper
  7. C#学习笔记之线程 - 同步上下文
  8. JMS详细的工作原理
  9. LU 分解 (LU Decomposition)
  10. 理解JavaScript面向对象的思路