golang timer panic recover
This project is maintained by wangfakang
go定时器以及panic recover的解析
使用select和无缓冲的chan的机制来进行构建定时器.首先select会去选择多个case中满足条件的一个来执行.
当多个case都满足条件的时候,其只会随机的执行其中的一个case.
package main
import "time"
func timer(input chan int) {
t1 := time.NewTimer(time.Second * 5)//每隔5秒钟向t1的chan中写数据
t2 := time.NewTimer(time.Second * 10)
for {
select {
case msg := <-input:
println(msg)
case <-t1.C:
println("5s timer")
t1.Reset(time.Second * 5)
case <-t2.C:
println("10s timer")
t2.Reset(time.Second * 10)
}
}
}
func main(){
cf := make(chan int)
go timer(cf)
cf <- 123
time.Sleep(100*time.Second)
}
go的异常处理一般使用panic来抛出程序异常,使用recover进行捕获异常.
package main
import "fmt"
func main() {
defer func() { //注意必须要先声明defer,否则不能捕获到panic异常
fmt.Println("recover start")
if err := recover(); err != nil {
fmt.Println(err)
}
fmt.Println("recover end")
}()
f()
}
func f() {
fmt.Println("main start")
panic("panic error")
fmt.Println("main end")
}
output:
main start
recover start
panic error
recover end
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流