首页 > 后端开发 > Golang > 为什么 Go 中的延迟函数无法增加指定的返回值?

为什么 Go 中的延迟函数无法增加指定的返回值?

Barbara Streisand
发布: 2024-12-25 17:39:16
原创
779 人浏览过

Why Does a Deferred Function Fail to Increment a Named Return Value in Go?

命名返回值如何与延迟函数交互

在 Go 中,命名返回值允许函数通过名称指定返回值,而不是使用位置论据。命名返回值和延迟函数之间的交互可能会令人困惑,如以下示例所示:

func c() (i int) {
    defer func() { i++ }()
    return 1
}
登录后复制

根据文档,该函数预计返回 2:“延迟函数可以读取并分配给返回函数的命名返回值。”然而,在这种情况下,函数返回 1,这似乎与文档相矛盾。

要理解这种行为,重要的是要记住,不带参数的 return 语句返回指定的返回值,称为“裸返回值”。 “ 返回。示例代码返回 1,因为它使用了 return 1,它显式地将返回值指定为 1。

延迟函数在 return 语句之后执行,递增 i。但是,此增量不会影响命名返回值 i,因为它有效地将新值分配给延迟函数内的局部变量。

这是因为 return 1 相当于:

i = 1
return
登录后复制

在具有命名返回值变量 i 的函数中,赋值 i = 1 设置命名返回值,而 return 语句只是退出函数,允许延迟函数执行并修改本地变量i 变量不影响指定的返回值。

因此,尽管使用了延迟函数来递增 i,但函数 c 实际上返回 1。

以上是为什么 Go 中的延迟函数无法增加指定的返回值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板