在if块

时间:2016-05-10 05:00:09

标签: go

err范围内创建if之后,在err语句中确定第二个 foo()是否有优势? }?特别是在记忆管理或惯用方面。

版本1

func foo() {
    temp, err := something()
    if err != nil {
        ...
    }

    if err := other(); err != nil {
        ...
    }
}

第2版

func foo() {
    temp, err := something()
    if err != nil {
        ...
    }

    err = other()
    if err != nil {
        ...
    }
}

https://golang.org/doc/effective_go.html#control-structures

2 个答案:

答案 0 :(得分:2)

请记住,error是一个界面。 nil接口的字节为零长度(空结构也是零长度)。

这意味着GC无需另外清理任何工作。

这是个人偏好,甚至还有第三种方式使用命名返回值:

func foo() (err error) {
    ...
}

虽然我强烈建议不要使用该模式。

就我个人而言,我更喜欢inline的惯用性,当我可以并且非常喜欢该模式允许我使用它时。但请记住,其他变量的范围仅在if:

中可用
if temp, err := other(); err != nil {
    // can only use temp here
    ...
}

(除非您提前定义变量,否则无法进行内联的目的)

但大多数情况下,我需要在评估后保持temp

temp, err := something()
if err != nil {
    ...
}
// continue to use temp

这意味着我的大多数代码都如上所示。

但是当我遇到允许它的模式时,你打赌我会使用它。例如,bufio' Writer.WriteByte

if err := writer.WriteByte(b); err != nil {
    ...
}

在外部范围内定义了writerb,最有可能进行err次检查。在评估范围之外定义err是没有意义的。

当您可以使用它时,限制err值的范围似乎是惯用的方式。

答案 1 :(得分:0)

范围变量的优势:

  • 由于无法从其他范围访问,因此会保留数据完整性。
  • 只能将所需数据传递给函数,从而保护剩余数据

看到这个:
Where can we use Variable Scoping and Shadowing in Go?

相关问题