Go:return 与 defer的执行顺序

2018-09-12  本文已影响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

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

好的。执行顺序确定了。

package main

//go:noinline
//go:nosplit

func test() (x int) {
    defer func() {
        x = 100
    }()
    return 200
}

func main() {
    println(test())
}

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

上一篇下一篇

猜你喜欢

热点阅读