请问大家 go 这个 defer 这里好像错了,是我的问题还是讲义错了? - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
mmnnyycc

请问大家 go 这个 defer 这里好像错了,是我的问题还是讲义错了?

  •  1
     
  •   mmnnyycc Mar 15, 2018 3588 views
    This topic created in 2993 days go, the information mentioned may be changed or developed.

    https://songjiayang.gitbooks.io/go-basic-courses/content/ch6/error.html

    本文档第二个例子,我试了一下,结果是 2,不是 4。本人版本go version go1.9.2 darwin/amd64

    package main import ( "fmt" ) func testDefer() (i int) { defer func() { fmt.Println(i) i = 4 }() return 2 } func main() { testDefer() } 
    18 replies    2018-03-16 18:45:55 +08:00
    happywowwow
        1
    happywowwow  
       Mar 15, 2018   1
    你要输出 testDefer() 的返回值...
    mmnnyycc
        2
    mmnnyycc  
    OP
       Mar 15, 2018
    @happywowwow 是的,谢谢
    kuaner
        3
    kuaner  
       Mar 15, 2018   1
    func main() {
    fmt.Println(testDefer())
    }
    ylcc
        4
    ylcc  
       Mar 15, 2018   1
    2 是 fmt.Println(i)的值...
    BBCCBB
        5
    BBCCBB  
       Mar 15, 2018   1
    楼上老哥说的对

    fmt.Println(testDefer())
    TanLian
        6
    TanLian  
       Mar 15, 2018   2
    看来你对 golang 的 return 没理解,golang 和 C、C++不同,golang 的 return 不是一个原子语句,在你这个例子中,
    把 return 2 分成了两步,第一步是 i=2,第二步是return i (注意是字母 i )。但由于 defer 的特性(这个不了解的话我也无能为力了),defer 是插在这两步中间的,所以实际上的执行过程是这样的,
    func testDefer() (i int) {
    i = 2

    func() {
    fmt.Println(i)
    i = 4
    }()

    return i
    }
    所以会打印 2,testDefer 函数的返回值是 4,明白?
    实际上这个题主要考察的是 return 和 defer,理解了这两个知识点,就不难理解为什么输出为 2 了。
    另可关注我的公众号“大后端开发”,讲解了 golang 的很多这方面的知识。
    mmnnyycc
        7
    mmnnyycc  
    OP
       Mar 15, 2018
    @TanLian 明白,defer 在 return 之后执行
    hawken
        8
    hawken  
       Mar 15, 2018
    @TanLian 没搜到“大后端开发”这个公众号啊
    wweir
        10
    wweir  
       Mar 16, 2018 via Android
    把 print 放到 main 里就是 4 了
    archliinux
        11
    archliinux  
       Mar 16, 2018   1
    @TanLian 这种水平就不要出来开公众号误导人了

    A defer statement pushes a function call onto a list. The list of saved calls is executed after the surrounding function returns.
    TanLian
        12
    TanLian  
       Mar 16, 2018
    @archliinux 不想和你争辩,公众号怎么你了?你牛逼怎么不见你分析,就在这喷别人
    TanLian
        13
    TanLian  
       Mar 16, 2018
    @archiinux 公众号的每篇文章都是一个字一个字的码出来的好吗,如果你觉得某个知识点有错误,可以提出来我确定后会改。但是如果你看都没看的话就这这 BB,那么就恕不奉陪了。
    nekoyaki
        14
    nekoyaki  
       Mar 16, 2018
    @TanLian
    第一,谁管你是不是一个字一个字码出来的,错了就是错了。
    第二,他扔出官方解释的原文来了,事实是他扔的原文是对的,你的理解完全是强行解释,理解错误。
    nekoyaki
        15
    nekoyaki  
       Mar 16, 2018
    @TanLian
    其实你的解释如果把什么“原子不原子”、“插在两步之间”去掉,也没什么问题,就怕画蛇添足……
    TanLian
        16
    TanLian  
       Mar 16, 2018
    @nekoyaki 看来你对 return 不理解,golang 的 return 本来就不是一个原子语句,这样解释没毛病,并且更利于他人理解,其他不想多说。
    nekoyaki
        17
    nekoyaki  
       Mar 16, 2018
    @TanLian
    看来你比 golang 官方文档更理解 golang。不愧是大牛,失敬失敬。
    TanLian
        18
    TanLian  
       Mar 16, 2018
    @nekoyaki 呵呵,也许我的表达有问题吧。不过你可以参考这几篇文章,应该就能理解我说的了。
    https://studygolang.com/articles/7548
    https://www.golangtc.com/t/56667d4db09ecc6de0000025
    https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html
    http://blog.csdn.net/hittata/article/details/77836435
    我不敢保证这几篇文章的内容有价值,仅作参考,当然你也可以忽略。
    另祝君安好。
    About     Help     Advertise     Blog     API     FAQ     Solana     971 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 22:14 PVG 06:14 LAX 15:14 JFK 18:14
    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