为了账号安全,请及时绑定邮箱和手机立即绑定

if 块中作用域变量的优势

if 块中作用域变量的优势

Go
白衣染霜花 2022-01-10 14:40:38
在 an的范围内创建之后,在语句中确定第二个的 范围是否有优势?特别是在内存管理或惯用语方面。erriferrfoo()版本 1func foo() {    temp, err := something()    if err != nil {        ...    }    if err := other(); err != nil {        ...    }}版本 2func foo() {    temp, err := something()    if err != nil {        ...    }    err = other()    if err != nil {        ...    }}https://golang.org/doc/effective_go.html#control-structures
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

记住,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当您可以使用它时,限制值的范围似乎是惯用的方式。


查看完整回答
反对 回复 2022-01-10
?
繁花如伊

TA贡献2012条经验 获得超12个赞

作用域变量的优点:

  • 由于无法从其他范围访问它,因此保留了数据完整性。

  • 只有需要的数据才能传递给函数,从而保护剩余的数据。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号