美文网首页
Go:return 与 defer的执行顺序

Go:return 与 defer的执行顺序

作者: 沙漠中的猴 | 来源:发表于2018-09-12 17:34 被阅读0次

    我将下面的代码放入了 double.go 文件内

    package main
    
    //go:noinline
    //go:nosplit
    
    func test() (x int) {
        defer println("defer")
        return 200
    }
    
    func main() {
        println(test())
    }
    
    

    执行go build -gcflags "-N -l" -o test double.go 告诉编译器,不内联、不优化。生成可执行文件 test

    反汇编来查看内容


    注意:十进制的200 转化成16进制是 0xc8

    通过上图的三个箭头可以看到。

    • 先对返回值进行赋值:MOVQ $0xc8, 0x30(SP)
    • 执行 defer 语句: CALL runtime.deferreturn(SB)
    • 执行RET指令(函数返回): RET

    好的。执行顺序确定了。

    package main
    
    //go:noinline
    //go:nosplit
    
    func test() (x int) {
        defer func() {
            x = 100
        }()
        return 200
    }
    
    func main() {
        println(test())
    }
    
    

    这道题的答案也就显而易见了。

    相关文章

      网友评论

          本文标题:Go:return 与 defer的执行顺序

          本文链接:https://www.haomeiwen.com/subject/ypcbgftx.html