defer 是否在函数 returns 之后运行?

Does defer runs after function returns?

我一直盯着这段代码,但无法弄清楚它的行为原因。

package main

import (
    "fmt"
)

var i int

func example() int {
    defer func() {
        fmt.Println("defer")
        i = 1
    }()

    fmt.Println("first")
    return i
}

func main() {
    fmt.Println(example())
    fmt.Println(i)
}

起初,我的预期输出是:

first
defer
1
1

但是,如您所见in the playground实际输出是:

first
defer
0
1

是延迟匿名函数行为吗? Nope

那么,为什么要打印 0

Does defer runs after function returns?

Certainly.

So, why is it printing 0?

因为你returning 0.

example() return 一个 int 按值。当计算 return i 时,i 的当前值是 returned。在评估 return 之后,执行 defer 函数,将存储在 i 的值更改为 1。但是 0 值已经是 return 值。

Go 可以修改函数的 return 值,但前提是 return 值有一个名称。

对于example, this returns 1:

func example() (j int) {
   defer func() { j = 1 }()
   return 0
}

但在你的情况下,你没有命名你的 return 变量,所以你不能在延迟中修改它。