Go博客示例代码中的拼写错误?
Go博客示例代码中的拼写错误? 以下是相关页面的链接:https://blog.golang.org/defer-panic-and-recover
页面中的示例代码如下:
func c() (i int) {
defer func() { i++ }()
return 1
}
我认为应该使用return i而不是原来的写法。我错了吗?
所以应该是:
func c() (i int) {
defer func() { i++ }()
return i
}
6 回复
该主题在上次回复后已自动关闭90天。不再允许新的回复。
saintlouis:
defer func() { i++ }() return i }
是的,我认为你是对的
我只在需要时使用命名返回值,例如在延迟处理错误或从panic恢复时需要设置返回值时。
// 代码示例
func example() (result int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("recovered from panic: %v", r)
}
}()
// 函数逻辑
return result, nil
}
非常感谢nathankerr。你的回复让我意识到在func c() (i int) {中,(i int)部分实际上是声明了返回变量。它实际上并不是声明中的参数部分,参数部分是空的。
我完全忽略了这一点。坦率地说,我觉得这相当容易误导/令人困惑。我想在生产代码中需要注意这一点。我的眼睛太习惯C代码(或其他语言)了,以至于没有注意到这个细节。
谢谢。
你提到的Go官方博客中的示例代码是正确的,原始写法return 1是故意这样设计的,用于演示defer函数如何修改命名返回值的行为。
在Go语言中,当函数使用命名返回值(如i int)时,defer函数可以访问并修改这些返回值。原始代码中:
return 1将返回值i设置为1- 然后执行defer函数
i++,将i从1增加到2 - 函数最终返回2
如果你改成return i:
return i时i的初始值是0(int类型的零值)- defer函数执行
i++后,i变为1 - 函数返回1
这两种写法都是有效的Go代码,但展示了不同的行为。博客原文使用return 1是为了更清晰地演示defer对返回值的修改机制。你的理解在语法上是正确的,但改变了示例想要展示的特定行为。


