go异常/错误机制
-
- defer
-
- 后进先出原则
- 立即解析原则
- 可修改返回值
- panic
defer
defer是go提供的一种延迟执行机制。
后进先出原则
当执行defer时,会将对应的函数压入栈中,在函数返回或者panic异常结束时,go会从栈中取出延迟函数执行。
func main(){ defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3") fmt.Println("hello") }
打印结果为
hello 3 2 1
立即解析原则
i := 1 defer fmt.Printf("first is %d\n", i) //1 i = 2 fmt.Printf("current is %d\n", i)//2
当 defer 以闭包的方式引用外部变量时,则会在延迟函数真正执行的时候,根据整个上下文确定当前的值
可修改返回值
func main() { fmt.Println(test()) } func test() (i int) { defer func() { i++ }() return 1 }
打印结果是2
panic
panic是一个严重错误机制,它会导致程序终止,并依次逆序执行 panic 所在函数可能存在的 defer 函数列表,然后返回该函数的调用方。
recover 内置函数可用于捕获 panic,重新恢复程序正常执行流程,但是 recover 函数只有在 defer 内部使用才有效
func main() { err := panicAndReturnErr() if err != nil{ fmt.Printf("err is %+v\n", err) } fmt.Println("returned normally from panicAndReturnErr") } func panicAndReturnErr() (err error){ defer func() {//如果defer内有recover,则从 panic 中恢复,不会终止程序 if e := recover(); e != nil {//error occur! // 打印栈信息 buf := make([]byte, 1024) buf = buf[:runtime.Stack(buf, false)] err = fmt.Errorf("[PANIC]%v\n%s\n", e, buf) } }() fmt.Println("panic begin") panic("error occur!")//开始执行defer函数 fmt.Println("panic over") return nil }
热门文章
- 4月25日最新Free Clash Meta订阅 | 18.2M/S|2025年Clash/Shadowrocket/SSR/V2ray免费节点地址链接分享
- 宠物美容师的前景怎么样啊(宠物美容师的前景怎么样啊知乎)
- 4月8日最新Free Clash Meta订阅 | 21.4M/S|2025年Shadowrocket/SSR/Clash/V2ray免费节点地址链接分享
- 3月15日最新Free Clash Meta订阅 | 20.6M/S|2025年V2ray/Clash/Shadowrocket/SSR免费节点地址链接分享
- 重庆宠物领养微信群号(重庆宠物领养微信群号是什么)
- 天津市宠物领养机构电话(天津市宠物领养中心地址)
- 3月29日最新Free Clash Meta订阅 | 21.8M/S|2025年Clash/V2ray/Shadowrocket/SSR免费节点地址链接分享
- 使用Python在D天内运送包裹的能力
- pandas apply() 函数用法
- 4月6日最新Free Clash Meta订阅 | 20.5M/S|2025年SSR/Shadowrocket/V2ray/Clash免费节点地址链接分享