2 回答

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当您可以使用它时,限制值的范围似乎是惯用的方式。
- 2 回答
- 0 关注
- 150 浏览
添加回答
举报