Timer
Timer顾名思义,就是定时器的意思,可以实现一些定时操作,内部也是通过channel来实现的。
package main
import (
"fmt"
"time"
)
func main() {
t1 := time.Now()
fmt.Printf("t1: %v\n", t1)
<-time.After(time.Second * 2) //等待2秒方法1
t2 := time.Now()
fmt.Printf("t2: %v\n", t2)
timer2 := time.NewTimer(time.Second * 2) //等待2秒方法2
<-timer2.C
t3 := time.Now()
fmt.Printf("t3: %v\n", t3)
time.Sleep(time.Second * 2) //等待2秒方法3
t4 := time.Now()
fmt.Printf("t4: %v\n", t4)
timer3 := time.NewTimer(time.Second)
go func() {
<-timer3.C
fmt.Println("Timer 3 expired")
}()
stop := timer3.Stop() //停止定时器
//阻止timer事件发生,当函数执行后,timer计时器停止,相应的事件不再执行
if stop {
fmt.Println("Timer 3 stop")
}
timer4 := time.NewTimer(time.Second * 5) //原来设置5s
timer4.Reset(time.Second * 4) //重新设置时间,重新开始计时
<-timer4.C
t5 := time.Now()
fmt.Printf("t5: %v\n", t5)
}
Ticker
Timer只执行一次,Ticker可以周期的执行。
实例1
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(time.Second)
counter := 1
for _ = range ticker.C {
fmt.Println("ticker 1")
counter++
if counter >= 3 {
ticker.Stop()
break
}
}
}
运行结果
ticker 1
ticker 1
实例2
package main
import (
"fmt"
"time"
)
func main() {
chanInt := make(chan int)
ticker := time.NewTicker(time.Second)
go func() {
for _ = range ticker.C {
select {
case chanInt <- 1:
case chanInt <- 2:
case chanInt <- 3:
}
}
}()
sum := 0
for v := range chanInt {
fmt.Printf("接收: %v\n", v)
sum += v
if sum >= 10 {
fmt.Printf("sum: %v\n", sum)
break
}
}
}
运行结果
在接收: 2
接收: 1
接收: 1
接收: 2
接收: 1
接收: 2
接收: 2
sum: 11