函数返回后是否延迟运行?

Hor*_*rus 2 go

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

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)
}
Run Code Online (Sandbox Code Playgroud)

首先,我的预期输出是:

first
defer
1
1
Run Code Online (Sandbox Code Playgroud)

但是,正如您在操场上看到的,实际输出是:

first
defer
0
1
Run Code Online (Sandbox Code Playgroud)

这是延迟匿名函数行为吗?没有

那么,为什么要打印呢0

Dan*_*ell 7

函数返回后是否延迟运行?

当然

那么,为什么打印0呢?

因为你返回的是 0。

example()按值返回int。当return i评估时,i返回 s 当前值。评估该返回值后,该defer函数将执行,将存储在的值更改i1。但该0值已经是返回值了。

Go 使得修改函数的返回值成为可能,但前提是返回值有名称。

例如,这返回 1

func example() (j int) {
   defer func() { j = 1 }()
   return 0
}
Run Code Online (Sandbox Code Playgroud)

但就您而言,您没有命名返回变量,因此您无法在延迟中修改它。