请各位帮忙看看这道题(Go),想了一天没想明白 - V2EX
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 2152 次点击
    这是一个创建于 1354 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这段程序输出什么?
     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-0-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     Solana     2035 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 00:59 PVG 08:59 LAX 16:59 JFK 19:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86