golang 使用defer、panic、recover的问题
2017-06-12 11:52
711 查看
defer
今天开发一个功能,犯了个小错误,记录下。简单代码如下:package main import ( "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 main import "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进行捕获 }
执行结果:
触发异常 打印后 打印中 打印前
相关文章推荐
- golang 函数-defer-recover-panic
- golang之defer、panic、recover
- GO_05_2:Golang 中 panic、recover、defer 的用法
- 【GoLang】panic defer recover 深入理解
- 53.笔记go语言——defer,panic,recover使用场景
- golang之defer,panic,recover用法
- golang的defer,recover,panic用法
- Golang中的defer, panic, recover
- golang学习的点点滴滴:异常处理 defer, panic, recover
- golang中的defer panic recover
- 理解Defer、Panic和Recover
- golang中recover和panic用法
- Go-defer,panic,recover
- Go语言中使用panic和recover简化错误处理
- Golang---Defer, Panic, and Recover
- go语言中的defer、panic、recover处理异常
- golang用panic和recover做业务流程中断的尝试
- Go的异常处理 defer, panic, recover
- 理解Defer、Panic和Recover
- golang panic and recover