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

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

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

Go
暮色呼如 2022-11-23 16:07:42
我一直盯着这段代码,无法弄清楚其行为的原因。package mainimport (    "fmt")var i intfunc example() int {    defer func() {        fmt.Println("defer")        i = 1    }()    fmt.Println("first")    return i}func main() {    fmt.Println(example())    fmt.Println(i)}起初,我的预期输出是:firstdefer11但是,正如您在操场上看到的那样,实际输出是:firstdefer01它是延迟的匿名函数行为吗?没有那么,为什么要打印0?
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超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
  • 1 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

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