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代码(或其他语言)了,以至于没有注意到这个细节。

谢谢。

上述代码的说明文字写道:

在这个示例中,延迟函数会在外围函数返回后对返回值 i 进行递增。因此,该函数返回 2:

c(0) 开始执行时,i 的值为 0(即 int 类型的零值)。为了让函数返回 2,i 需要先变为 1,这样在 defer 延迟函数中执行的递增操作会将返回值(i)增加到 2。return 1i 设置为 1。

由于返回值函数必须包含 return 语句,这行 return 1 是同时实现将 i 设为 1(如说明文字所要求)和执行 return 的最简方式。

你提到的Go官方博客中的示例代码是正确的,原始写法return 1是故意这样设计的,用于演示defer函数如何修改命名返回值的行为。

在Go语言中,当函数使用命名返回值(如i int)时,defer函数可以访问并修改这些返回值。原始代码中:

  • return 1将返回值i设置为1
  • 然后执行defer函数i++,将i从1增加到2
  • 函数最终返回2

如果你改成return i

  • return ii的初始值是0(int类型的零值)
  • defer函数执行i++后,i变为1
  • 函数返回1

这两种写法都是有效的Go代码,但展示了不同的行为。博客原文使用return 1是为了更清晰地演示defer对返回值的修改机制。你的理解在语法上是正确的,但改变了示例想要展示的特定行为。

回到顶部