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

大佬们帮我看看这个 defer 的问题呗

  •  
  •   d0m2o08 · 2019-06-13 09:57:37 +08:00 · 1868 次点击
    这是一个创建于 1794 天前的主题,其中的信息可能已经有所发展或是发生改变。
    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	fmt.Println(testRet())
    }
    
    func testRet() int {
    	var ret int
    	defer func() {
    		fmt.Println("执行了 defer")
    		ret++
    	}()
    	return ret
    }
    

    这段代码为什么返回的是 0 不是 1 ? 是我姿势不对么

    seaZhang
        1
    seaZhang  
       2019-06-13 10:09:50 +08:00
    defer 在 return 之后
    yph007595
        2
    yph007595  
       2019-06-13 10:10:07 +08:00   ❤️ 1
    你去看看 defer 和 return 的顺序就搞明白了
    要想返回 1,应该这么写

    func testRet() (ret int) {
    defer func() {
    fmt.Println("执行了 defer")
    ret++
    }()
    return
    }
    SuperMild
        3
    SuperMild  
       2019-06-13 10:19:12 +08:00
    如果这样,就会返回 3

    func testRet() (ret int) {
    defer func() {
    fmt.Println("执行了 defer")
    ret++
    }()
    return 2
    }
    lasuar
        4
    lasuar  
       2019-06-13 10:23:20 +08:00   ❤️ 1
    defer 是会执行,但是你 return 后面加了 ret,此时的 ret 是 0, 那你函数的返回值就已经定死,参考 2 楼
    beidounanxizi
        5
    beidounanxizi  
       2019-06-13 10:33:41 +08:00
    https://studygolang.com/articles/14831
    https://blog.golang.org/defer-panic-and-recover
    自己去看下哈 主要理解执行顺序 和 retvalue 含义
    beidounanxizi
        6
    beidounanxizi  
       2019-06-13 10:36:00 +08:00
    Deferred functions may read and assign to the returning function's named return values.

    named return values 强调
    SuperMild
        7
    SuperMild  
       2019-06-13 10:36:16 +08:00
    @lasuar 和加了 ret 没关系,这样也返回 1

    func testRet() (ret int) {
    defer func() {
    fmt.Println("执行了 defer")
    ret++
    }()
    return ret
    }
    lasuar
        8
    lasuar  
       2019-06-13 23:20:42 +08:00
    @SuperMild OK,差点误导楼主。原来是 defer 操作对匿名返回值和命名返回值两种情况的处理不同导致的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1176 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:32 · PVG 02:32 · LAX 11:32 · JFK 14:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.