关于 defer 的案例有点不太理解(新手)

2022-07-23 09:10:07 +08:00
 Asakijz

在看 defer 案例的时候看到这题有点不太理解,为什么后两句会输出 nil ? 是因为这个 err 只能使用一次嘛?

2203 次点击
所在节点    Go 编程语言
11 条回复
learningman
2022-07-23 09:22:12 +08:00
前面两个在 defer 注册的时候,err 的值已经固定了,第一个不用说了,第二个也捕获了当时为 nil 的 err ,只有最后一个能拿到 return 时的外层的 err 。
闭包那块的东西。
Asakijz
2022-07-23 09:24:51 +08:00
@learningman 那是不是可以这么理解,就是在使用 defer 的时候,里面就已经确定了对应类型的零值了。而因为第三条语句是闭包所以能逐层向外寻找 err 值
learningman
2022-07-23 09:25:52 +08:00
@Asakijz #2 不是存了 0 值,是存了注册时变量对应的值
Asakijz
2022-07-23 09:32:37 +08:00
@learningman 感谢,现在理解了
keepeye
2022-07-23 10:09:11 +08:00
前两句,值已经确定了
wd
2022-07-23 11:06:00 +08:00
学习下闭包吧 这概念各种语言里面都有。以前我记得面试 js 的时候必问闭包..
Asakijz
2022-07-23 11:23:32 +08:00
@wd 完全没有编程基础,都说 Go 挺火的,就下班之后学习下,所以学习的时候有些地方会卡壳。。
wd
2022-07-23 13:28:49 +08:00
@Asakijz 别着急。你这入门肯定会比较慢,耐下心来,过几年会有效果的。我刚开始学的时候连 i=i+1 都死活看不懂
lasfresas
2022-07-23 14:15:35 +08:00
感谢,我也顺便巩固了一下
raynor2011
2022-07-23 17:26:57 +08:00
前面两个 err 是传进去的,最后一个是现取的
tianyou666shen
2022-07-25 13:14:57 +08:00
defer 把一个调用函数压入栈,随后在函数 return 执行时先进后出地执行.
如果函数的参数存在未确定的值,就会先确定函数参数值,再将整个语句存入 defer 的调用栈.

在这个题目:
最后一个使用函数没有参数,所以没用确定一个固定的参数传入.前两行的函数需要函数参数,所以会去寻找一个固定值.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868146

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX