【Go 语言入门很简单(Timer)】于今腐草无萤火,终古垂杨有暮鸦。这篇文章主要讲述Go 语言入门很简单:Timer相关的知识,希望能为你提供帮助。
Timer
我们经常希望在未来的某个时间点执行 Go 代码,或者在某个时间间隔重复执行。 Go 的内置计时器和自动收录器功能使这两项任务变得简单。
Timer 是一个定时器。代表未来的一个单一事件,你可以告诉 timer 你要等待多长时间。
Timer 结构体:
type Timer struct
C <
-chan Time
r runtimeTimer
它提供一个 channel,在定时时间到达之前,没有数据写入 timer.C 会一直阻塞。直到定时时间到,向 channel 写入值,阻塞解除,可以从中读取数据。
计时器代表未来的单个事件。您告诉计时器您要等待多长时间,它提供了一个届时将通知的通道。此计时器将等待 2 秒。
??<
-timer1.C?
?
在定时器的通道 C 上阻塞,直到它发送一个指示定时器触发的值
如果您只是想等待,您可以使用 time.Sleep。计时器可能有用的一个原因是您可以在计时器触发之前取消它。这是一个例子。
package main
import (
"fmt"
"time"
)
func main()
timer1 := time.NewTimer(2 * time.Second)
<
-timer1.C
fmt.Println("Timer 1 fired")
timer2 := time.NewTimer(time.Second)
go func()
<
-timer2.C
fmt.Println("Timer 2 fired")
()
stop2 := timer2.Stop()
if stop2
fmt.Println("Timer 2 stopped")
time.Sleep(2 * time.Second)
给 ??timer2?
?
足够的时间来触发它,如果它会触发的话,以表明它实际上已经停止了。
第一个计时器将在我们启动程序后约 2 秒触发,但第二个应该在它有机会触发之前停止.
运行该代码:
$ go run timers.go
Timer 1 fired
Timer 2 stopped
time.After
??time.After?
?
等待指定的持续时间,然后在返回的通道上发送当前时间:
select
case news := <
-AFP:
fmt.Println(news)
case <
-time.After(time.Hour):
fmt.Println("No news in an hour.")
在计时器触发之前,垃圾收集器不会回收底层的 time.Timer。如果这是一个问题,请改用 ??time.NewTimer?
?
并在不再需要计时器时调用其 ??Stop?
?
方法:
for alive := true;
alive;
timer := time.NewTimer(time.Hour)
select
case news := <
-AFP:
timer.Stop()
fmt.Println(news)
case <
-timer.C:
alive = false
fmt.Println("No news in an hour. Service aborting.")
Timer 模式
package main
import (
"time"
"fmt"
)
const time_in_seconds = 60
func main()
// 60 second timer.
timer := time.NewTimer(time.Second*time_in_seconds)
// Stop the timer at the end of the function.
// Defers are called when the parent function exits.
defer timer.Stop()
// Wait for timer to finish in an asynchronous goroutine
go func()
// Block until timer finishes. When it is done, it sends a message
// on the channel timer.C. No other code in
// this goroutine is executed until that happens.
<
-timer.C
// If main() finishes before the 60 second timer, we wont get here
fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
executeTheCodeThatMightTakeMoreThanSixtySeconds()
// The main function is finished, so the timer will be told to stop.
提取定时器实用功能
我们将上述模式提取为效用函数。它在指定的时间段内运行计时器,然后调用提供的函数。
package main
import (
"time"
"fmt"
)
const time_in_seconds = 60
func main()
// Run timer for 60 seconds. When timer expires,
// call a function to print out that our timer is done.
timer := NewTimer(time_in_seconds, func()
fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
)
defer timer.Stop()
executeTheCodeThatMightTakeMoreThanSixtySeconds()
// NewTimer creates a timer that runs for a specified number of seconds.
// When the timer finishes, it calls the action function.
// Use the returned timer to stop the timer early, if needed.
func NewTimer(seconds int, action func()) *time.Timer
timer := timer.NewTimer(time.Seconds * time.Duration(seconds))
go func()
<
-timer.C
action()
return timer
TimeAfterFunc 函数
timer := time.AfterFunc(time.Second*60, func()
fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
)
defer timer.Stop()
推荐阅读
- 匿名访问FTP服务
- 如何制作一个塔防小游戏
- 随笔安卓平台YUV数据(NV12/I420)渲染
- 团体项目_第11组_音悦app_原型
- 转自红鱼儿推荐内置android控件的开源项目alcinoe
- 使用fidder对安卓模拟器进行抓包
- Appium常用指令
- xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml
- mapper @Select()注解开发,使用模板 if 和循环