在开发中,经常遇到一些需要定时任务的场景。go中用time包就能实现。
简单实例:
package main
import (
"fmt"
"time"
)
func main(){
t := time.NewTicker(time.Second)
for v := range t.C {
fmt.Println("hello ", v)
}
}
以上程序每隔1s执行一次,结果如下:
time.After一秒之后执行一次,可以实现超时的控制,(等价于NewTimer(d).C,不建议使用此方式),实例如下:
package main
import (
"fmt"
"time"
)
func main() {
intChan := make(chan int, 10)
intChan2 := make(chan int, 10)
go func() {
i := 0
for {
intChan <- i
time.Sleep(time.Second)
intChan2 <- i * i
i ++
}
}()
for {
select {
case v := <-intChan:
fmt.Println(v)
case b := <-intChan2:
fmt.Println(b)
case <-time.After(time.Second):
fmt.Println("time out")
}
}
}
建议使用下面方式实现超时功能:
package main
import (
"fmt"
"time"
)
func main() {
intChan := make(chan int, 10)
intChan2 := make(chan int, 10)
t := time.NewTicker(time.Second)
go func() {
i := 0
for {
intChan <- i
time.Sleep(time.Second)
intChan2 <- i * i
i ++
}
}()
for {
select {
case v := <-intChan:
fmt.Println(v)
case b := <-intChan2:
fmt.Println(b)
//case <-time.After(time.Second):
// fmt.Println("time out")
case <-t.C:
fmt.Println("time out")
}
t.Stop()
}
}
补充:recover()函数可以捕获程序的panic,保证程序不会因为panic而结束进程,实例如下:
package main
import (
"fmt"
"time"
)
func calc(){
defer func(){
if err := recover();err!=nil{
fmt.Println("panic: ", err)
}
}()
var m map[int]int
m[1] = 1
}
func test() {
for {
fmt.Println(" test ")
time.Sleep(time.Second)
}
}
func main() {
go test()
for i:=0;i<2;i++ {
go calc()
}
time.Sleep(10*time.Second)
}