请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

defer闭包调用err的识别问题

func deferDemo() error {
err := createResource1()
if err != nil {
return ERR_CREATE_RESOURCE1_FAILED
}
defer func() {
if err != nil {
destroyResource1()
}
}()
err = createResource2()
if err != nil {
return ERR_CREATE_RESOURCE2_FAILED
}
defer func() {
if err != nil {
destroyResource2()
}
}()
err = createResource3()
if err != nil {
return ERR_CREATE_RESOURCE3_FAILED
}
defer func() {
if err != nil {
destroyResource3()
}
}()
err = createResource4()
if err != nil {
return ERR_CREATE_RESOURCE4_FAILED
}
return nil
}

老师,我想问一下假如createResource1和createResource3在调用时err的返回值都不为空,那么在后续的defer过程中,是如何区分哪个defer里的err对应之前的1和3?因为这个err属于闭包的外部变量,但是在外面的时候err是被重复赋值的,所以我搞不明白它怎么判断哪个err对应哪个函数。

正在回答 回答被采纳积分+3

1回答

bobby 2023-02-27 13:51:26

你这里createResource1和createResource3用的是同一个变量, 当createResource3执行完以后createResource1的err就被覆盖了,何来如何区别的问题?,谁后执行就是谁的

0 回复 有任何疑惑可以回复我~
  • 提问者 0沉默使者0 #1
    可是如果那样的话,createResource3的defer执行之后,因为err被覆盖了不为nil,那后续所有的defer中的"if err != nil {}”里的语句岂不是都会执行?这种处理方式是合理的吗?
    回复 有任何疑惑可以回复我~ 2023-02-27 19:36:40
  • bobby 回复 提问者 0沉默使者0 #2
    是的 err被覆盖为nil了你上面的代码就不会执行到了,你可以测试一下
    回复 有任何疑惑可以回复我~ 2023-02-28 13:11:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信