defer 是否在函数返回后运行?

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


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

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


first

defer

0

1

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


那么,为什么要打印0?


暮色呼如
浏览 71回答 1
1回答

胡说叔叔

defer 是否在函数返回后运行?当然。那么,为什么要打印 0 呢?因为你要返回 0。example()按值返回int。return i评估时,i返回当前值。评估返回值后,defer函数将执行,将存储在 的值更改i为1。但是这个0值已经是返回值了。Go 允许修改函数的返回值,但前提是返回值有一个名称。例如,这将返回 1:func example() (j int) {   defer func() { j = 1 }()   return 0}但在你的情况下,你没有命名你的返回变量,所以你不能在延迟中修改它。
打开App,查看更多内容
随时随地看视频慕课网APP