命名返回值如何与延迟函数交互
在 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中文网其他相关文章!