defer闭包调用err的识别问题

来源:12-5 gopath开发模式和go modules开发模式对比

0沉默使者0

2023-02-25

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对应哪个函数。

写回答

1回答

bobby

2023-02-27

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

0
2
bobby
回复
0沉默使者0
是的 err被覆盖为nil了你上面的代码就不会执行到了,你可以测试一下
2023-02-28
共2条回复

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程