if 块中作用域变量的优势

在 an的范围内创建之后,在语句中确定第二个的 范围是否有优势?特别是在内存管理或惯用语方面。erriferrfoo()


版本 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


白衣染霜花
浏览 151回答 2
2回答

Qyouu

记住,error是一个接口。nil 接口的字节长度为零(空结构的长度也为零)。这意味着 GC 不需要额外的工作来清理任何一种方式。这是个人喜好,甚至还有第三种使用命名返回值的方法:func foo() (err error) {    ...}虽然我强烈建议不要使用这种模式。就个人而言,我更喜欢inlineif的惯用性质,当我可以并且真正享受模式允许我使用它时。但请记住,其他变量的作用域仅在 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 {    ...}wherewriter和b被定义在外部范围内,很可能是用他们自己的err检查。err在评估范围之外定义为零点。err当您可以使用它时,限制值的范围似乎是惯用的方式。

繁花如伊

作用域变量的优点:由于无法从其他范围访问它,因此保留了数据完整性。只有需要的数据才能传递给函数,从而保护剩余的数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go