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

请各位帮忙看看这道题(Go),想了一天没想明白

  •  
  •   Kiriri · 2022-03-23 19:26:35 +08:00 · 1760 次点击
    这是一个创建于 980 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这段程序输出什么?
      package main
    
      func main() {
    
          println(DeferFunc1(1))
          println(DeferFunc2(1))
          println(DeferFunc3(1))
      }
    
      func DeferFunc1(i int) (t int) {
          t = i
          defer func() {
              t += 3
          }()
          return t
      }
    
      func DeferFunc2(i int) int {
          t := i
          defer func() {
              t += 3
          }()
          return t
      }
    
      func DeferFunc3(i int) (t int) {
          defer func() {
              t += i
          }()
          return 2
      }
    
    

    输出结果是 4 1 3 ,我没明白第二个为什么会是 1 呢

    Nasei
        1
    Nasei  
       2022-03-23 19:33:20 +08:00   ❤️ 1
    ```go

    func DeferFunc2(i int)(ret int) {
    t := i
    ret = t
    t += 3
    return
    }

    ```
    iyear
        2
    iyear  
       2022-03-23 19:45:49 +08:00   ❤️ 1
    wffnone
        3
    wffnone  
       2022-03-23 19:58:11 +08:00 via iPhone   ❤️ 1
    我回答你这个问题我会觉得我自己是**。
    行了我就是**我承认,让我回复。

    你问问题,我不管你问的问题是多么简单多么基础,最起码你要把你不懂的地方清楚地表达出来。你没明白,你具体哪里不明白?能再具体一点吗?你有过哪些思考?能列出来吗?你考虑了几种情况,你把一个问题分解成多少个小问题?你认为问题有可能出在哪里?
    再回到学习过程。你使用什么学习资料?你还查阅了哪些辅助资料?整个的情境如何?你的基础知识如何?

    你真的想了一天吗?如果你真的想了一天,你应该有很多收获,很多非常有价值的在未来学习中都能有帮助的根本性的一些认识。把你这一天分享出来,对专家级的程序员们也会有帮助。

    网友们不是你爸妈,大家是平等的。一个好问题也能带给大家价值。而你就有能力给出一个好问题(而你没有给出来)。

    为了表达善意(中和恶意),也为了坐实我就是**,让我把参考资料给你。

    1. defer: https://go.dev/blog/defer-panic-and-recover
    2. scope: https://en.m.wikipedia.org/wiki/Scope_(computer_science)
    haozibi
        4
    haozibi  
       2022-03-23 20:00:52 +08:00   ❤️ 1
    这种题有什么意义呢?
    iyear
        5
    iyear  
       2022-03-23 20:01:26 +08:00
    @wffnone #3 你这阿里味可真冲🤮

    ```
    你做这个的底层逻辑是什么?顶层设计在哪里?最终交付价值是什么?过程的抓手在哪里?如何保证结果的闭环?能否赋能产品生态?你比别人做的亮点在哪?优势在哪?我没有看到你的沉淀和思考,你有形成自己的方法论吗?你得让别人清楚,凭什么做这个的人是你,换别人来做不一样吗?今年 3.25 你背一下吧。
    ```
    Aoang
        6
    Aoang  
       2022-03-23 20:06:07 +08:00 via iPhone   ❤️ 1
    DeferFunc2 中 defer 修改的是 t ,不是返回的值。建议看看 defer 相关的内容
    XTTX
        7
    XTTX  
       2022-03-23 20:12:11 +08:00
    就是一个 passed by value 和 passed by reference 的问题。
    XTTX
        8
    XTTX  
       2022-03-23 20:14:06 +08:00   ❤️ 1
    其实这个最关键的问题, 两种返还值的方式不同。 个人倾向别用 named return.
    wffnone
        9
    wffnone  
       2022-03-23 20:14:57 +08:00 via iPhone
    @iyear OP 说想了一天啊。我是真的有点好奇怎么能想一天,问题都是我真心的提问- -…
    iyear
        10
    iyear  
       2022-03-23 20:16:06 +08:00
    @wffnone #9 我以为是夸张描述吧,如果是真想了一天我收回我的回复.sorry
    wffnone
        11
    wffnone  
       2022-03-23 20:18:29 +08:00 via iPhone
    @iyear 哎,我是老实人吧。我承认我语气不太好,但是也不是完全言之无物的吧- -可能语气很重要吧
    XTTX
        12
    XTTX  
       2022-03-23 20:24:55 +08:00   ❤️ 1
    ```go
    func DeferFunc1(i int) (t int) {
    fmt.Println(t)
    t = i
    defer func() {
    t += 3
    }()
    fmt.Println(t)
    return t
    }
    ```

    reference 和 value 本来就是容易混淆的事, 不管是什么语言。 稍不注意就会出现很多奇奇怪怪的场景. js 也是。 懂了原理过一段时间也会忘掉。 最好就是保持同一种处理方式,这样至少能避免不少麻烦
    twing37
        13
    twing37  
       2022-03-23 20:29:07 +08:00   ❤️ 1
    For instance, if the deferred function is a function literal and the surrounding function has named result parameters that are in scope within the literal, the deferred function may access and modify the result parameters before they are returned. If the deferred function has any return values, they are discarded when the function completes. (See also the section on handling panics.)

    https://go.dev/ref/spec#Defer_statements
    Kiriri
        14
    Kiriri  
    OP
       2022-03-23 20:30:38 +08:00
    @wffnone 夸张描述,抱歉,只是这一天中,隔一时半会就会想一下,没想明白。
    TheF00L
        15
    TheF00L  
       2022-03-24 09:39:51 +08:00
    @wffnone 搁这当爹来了,您是真**🤢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1383 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 17:33 · PVG 01:33 · LAX 09:33 · JFK 12:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.