Go每天一篇(day65)----defer(),recover(),painc()进阶

本文详细解析了Go语言中关于`defer`, `panic`, `recover`的使用,通过实例解释了它们的工作原理,包括defer的执行顺序,panic引发的流程,以及recover如何捕获和处理panic。文中还提醒了flag布尔变量的正确比较方式,并提供了运行结果和解析。" 111639539,8612593,Java使用EasyExcel导出ZIP文件,"['Java开发', '文件操作', '数据导出', '压缩技术']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、今日题目
  1. flag是bool型变量,下面if表达式符合编码规范的是?
    A.if flag
    B.if flag
    C.if flag==false
    D.if !flag

  2. 下面的代码输出什么,请说明:

    func main() {
    	defer func() {
    		fmt.Print(recover())
    	}()
    	defer func() {
    		defer func() {
    			defer fmt.Print(recover())
    		}()
    		panic(1)
    	}()
    	defer recover()//无效
    	panic(2)
    }
    
二、答案:

1.BCD
2.输出结果:12

三、解析:
  1. flag是bool型,不能与int类型的0,1做比较。可以跟true或者false进行比较。

  2. 首先,第一个defer执行,将recover()压入栈中,其次第二个defer执行压入栈的第二层,然后第二个defer中又嵌套一个defer,将嵌套的defer压入第二个defer的defer栈中第一层,继续往下执行,遇到panic,抛出panic(1)。遇到panic程序不会立刻上传,而是将defer执行完。根据defer知识。defer是最后再执行,第二个defer执行完继续往下执行,遇到panic(2),抛出panic(2),然后回去调用第五行的defer,然后调用panic(1),然后panic(1)会调用第7行的recover被捕获并打印出1,最后继续执行第三行,panic(2)被捕获并打印2。最后输出1,2
    实例:

    func main() {
    	defer func() {
    		fmt.Print(recover())
    	}()
    	defer func() {
    		defer func() {
    			fmt.Println(22)
    			defer fmt.Println(recover())
    			fmt.Println(333)
    		}()
    		panic(111)
    		fmt.Println(444)
    	}()
    	fmt.Println(555)
    	defer recover()//无效
    	panic(2)
    	fmt.Println(666)
    }
    

    运行结果:
    555
    22
    333
    111
    2

解析实例:
首先,将第一个defer压入栈中,其次将第二个defer压入第二层,然后第二个defer中又嵌套一个defer,将嵌套的defer压入第二个defer的defer栈中第一层,继续往下执行,遇见panic,程序不会立刻停止,而是将defer执行完。第三步依次执行并输出555,往下运行,defer recover()无效,继续往下执行,遇到panic(2),根据defer的先进后出原则,调用第二个defer。往下执行遇到defer(),跳过往下执行,遇到panic(111),然后调用嵌套中的defer,依次执行,输出22,遇见defer,捕获panic(111),继续往下执行输出333,再输出捕获的panic里面的111。最后调用第一个defer,捕获panic(2)并打印输出2

defer,panic,recover的相关知识参考Go每天一篇(day64)----panic()和recover()
最后,解析若有错误之处,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值