概述
time.Timetimetime.Time.After()timetime.After()
函数签名
func After(d Duration) <-chan Time
参数说明
dtime.After(time.Minute)time.After(60 * time.Second)
实例
time.After()
实例1 – 基本使用
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main goroutine started...")
// 等待3秒钟
tmr := time.After(3 * time.Second)
// 通过通道等待时间到达
<-tmr
fmt.Println("time elapsed...")
}
上述代码创建了一个3秒钟的计时器,并在计时器结束后输出了 “time elapsed…”。计时器和通道的结合使得我们可以在休眠期间阻塞程序并等待一个事件,这是在Go语言中常用的模式。
实例2 – 多个计时器
下面的例子使用了多个计时器,每个计时器在不同的时间间隔后触发。当所有计时器都触发时,程序将终止。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main goroutine started...")
// 创建3个计时器
tmr1 := time.After(3 * time.Second)
tmr2 := time.After(5 * time.Second)
tmr3 := time.After(10 * time.Second)
// 等待所有计时器事件完成
<-tmr1
fmt.Println("timer1 elapsed...")
<-tmr2
fmt.Println("timer2 elapsed...")
<-tmr3
fmt.Println("timer3 elapsed...")
fmt.Println("done")
}
该程序将在3秒钟、5秒钟和10秒钟之后触发三个计时器。时间到期后,计时器会触发并打印输出,程序最后输出 “done”。需要注意的是,所有计时器都使用了单独的通道等待事件触发,这些通道可以在任何时间协程中使用。
实例3 – 撤销计时器
time.Ticker
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main goroutine started...")
// 创建一个计时器
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
// 等待10秒钟
time.Sleep(10 * time.Second)
// 撤销 fmt.Println("ticker stopped...")
}
tickerdefer
time.Sleep()timetime.Time.After()timetime