golang 使用defer、panic、recover的问题

来源:互联网 发布:圣思园java视频下载 编辑:程序博客网 时间:2024/05/22 11:52

defer

今天开发一个功能,犯了个小错误,记录下。简单代码如下:

package mainimport (    "fmt"    "sync"    "time")func main() {    var mt sync.Mutex    for i := 0; i < 10; i++ {        go func(index int) {            for j := 0; j < 3; j++ {                mt.Lock()                defer func() {                    mt.Unlock()                    fmt.Println("release done")                }()                fmt.Printf("%d_%d\n", index, j)            }        }(i)    }    time.Sleep(time.Second * time.Duration(1))    fmt.Println("finish!")}

执行后发现协成一直卡在了defer释放的地方,而把defer mt.Unlock()直接放在打印后,采用手动释放的方式就没问题。
直接原因:
1. defer的作用域是整个函数,不是某个for循环之类的局部变量;
2. defer是堆栈,后进先出

panic、recover

package mainimport "fmt"func main() {    defer_call()}func defer_call() {    defer func() {        if err := recover(); err != nil {            fmt.Println(err) //此处的err其实是panic传入的值        }    }()    defer func() { fmt.Println("打印前") }()    defer func() { fmt.Println("打印中") }()    defer func() { fmt.Println("打印后") }()    panic("触发异常") //需要使用recover进行捕获}

执行结果:

触发异常打印后打印中打印前
原创粉丝点击