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进行捕获}
执行结果:
触发异常打印后打印中打印前
阅读全文
0 0
- golang 使用defer、panic、recover的问题
- golang中的defer panic recover
- Golang---Defer, Panic, and Recover
- Golang中的defer, panic, recover
- 【GoLang】panic defer recover 深入理解
- golang之defer,panic,recover用法
- GOLANG的PANIC和RECOVER
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover
- Go panic, defer, recover 的异常处理
- Go的异常处理 defer, panic, recover
- Defer, Panic, and Recover
- Go-defer,panic,recover
- Defer, Panic, and Recover
- GO defer panic recover
- 理解Defer、Panic和Recover
- TP获取操作日志需要的值(ip、当前页面、全部get、post值)
- ETL的经验总结
- java-用加减法显示验证码
- Web容器安全管理(下)——容器基本身份验证
- 页面中字符串超出后的解决方案
- golang 使用defer、panic、recover的问题
- Android短信倒计时功能的实现
- Android设置禁止截屏
- for 循环嵌套性能
- 大型网站技术架构_读后感
- 括号匹配
- solr启动失败404的原因
- 部署Spring AOP出现org.springframework.beans.factory.BeanCreationException解决方法
- parse_str()—将url参数字符串转成数组