V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Asakijz
V2EX  ›  Go 编程语言

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

  •  1
     
  •   Asakijz · 2022-07-23 09:10:07 +08:00 · 1848 次点击
    这是一个创建于 642 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    jOXc3n.png

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

    在这个题目:
    最后一个使用函数没有参数,所以没用确定一个固定的参数传入.前两行的函数需要函数参数,所以会去寻找一个固定值.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5543 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 06:03 · PVG 14:03 · LAX 23:03 · JFK 02:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.