Go5

golang timer panic recover

This project is maintained by wangfakang

go定时器以及panic recover的解析

go定时器的实现:

原理:

使用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的异常处理机制:

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

欢迎一起交流学习

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

Thx

Author