在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 {
...
}
}
答案 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 {
...
}
在外部范围内定义了writer
和b
,最有可能进行err
次检查。在评估范围之外定义err
是没有意义的。
当您可以使用它时,限制err
值的范围似乎是惯用的方式。
答案 1 :(得分:0)
范围变量的优势:
看到这个:
Where can we use Variable Scoping and Shadowing in Go?