The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
d0m2o08

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

  •  
  •   d0m2o08 · Jun 13, 2019 · 2794 views
    This topic created in 2710 days ago, the information mentioned may be changed or developed.
    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
    seaZhang
    Jun 13, 2019
    1
    defer 在 return 之后
    arthurblake
    arthurblake
    Jun 13, 2019❤️1
    2
    你去看看 defer 和 return 的顺序就搞明白了
    要想返回 1,应该这么写

    func testRet() (ret int) {
    defer func() {
    fmt.Println("执行了 defer")
    ret++
    }()
    return
    }
    SuperMild
    SuperMild
    Jun 13, 2019
    3
    如果这样,就会返回 3

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

    named return values 强调
    SuperMild
    SuperMild
    Jun 13, 2019
    7
    @lasuar 和加了 ret 没关系,这样也返回 1

    func testRet() (ret int) {
    defer func() {
    fmt.Println("执行了 defer")
    ret++
    }()
    return ret
    }
    freemoon
    freemoon
    Jun 13, 2019
    8
    @SuperMild OK,差点误导楼主。原来是 defer 操作对匿名返回值和命名返回值两种情况的处理不同导致的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2260 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 10:46 · PVG 18:46 · LAX 02:46 · JFK 05:46
    ♥ Do have faith in what you're doing.