为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
暮色呼如 2022-11-23 16:07:42

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


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?


查看完整描述

1 回答

?
胡说叔叔

TA贡献1539条经验 获得超8个赞

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

当然

那么,为什么要打印 0 呢?

因为你要返回 0。

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

Go 允许修改函数的返回值,但前提是返回值有一个名称。

例如,这将返回 1

func example() (j int) {

   defer func() { j = 1 }()

   return 0

}

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



查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信