如何忽略GO中的返回错误

Dan*_*-Br 2 go

我今天开始学习Go.
有一件事让我发疯,这是err返回的参数.

我们假设我需要嵌套一些函数.像这样:

return string(json.Marshal(MyData))
Run Code Online (Sandbox Code Playgroud)

或更复杂的例子:

return func1(func2(func3(MyData)))
Run Code Online (Sandbox Code Playgroud)

是否真的有必要写:

tmp1 , _ = func3(MyData)
tmp2 , _ = func2(tmp1)
tmp3 , _ = func1(tmp2)
return tmp3
Run Code Online (Sandbox Code Playgroud)

那很烦人!
有没有办法让代码看起来更干净?

Sta*_*ven 6

真正的答案是:不.

永远不要忽略错误.

认真.错误是有原因的.如果一个函数返回一个错误,它几乎总是意味着在程序运行期间,即使它是100%无错误,也可能 使函数失败.如果确实如此,你通常不想继续前进就好像什么也没发生一样.

如果你完全确定你正在使用一个函数来确保它永远不会返回一个非零错误(除非程序中有错误,并且总是存在),你可能想写一个Must-类似于template中的样式函数,它会返回错误值.

错误处理不是噪音.这不是混乱.这不是你想要摆脱的东西.如果看起来50%的程序是错误处理,那是因为50%的程序是错误处理.

  • 绝对同意@SkyKelsey。教条的纯粹主义不是值得骄傲的。 (5认同)
  • 这不是对问题的答案,而是一种意见。有正当理由忽略该错误值。 (3认同)
  • 除非文档明确指出函数返回 `nil`:例如 `strings.WriteString()`:“WriteString 将 s 的内容附加到 b 的缓冲区。它返回 s 的长度和一个 nil 错误。” (2认同)

Rey*_*les 5

可以定义一个函数来忽略错误,但是 Go 缺乏泛型,所以你必须到处使用 interface{} 和类型转换,在这个过程中失去了类型检查器的很多静态保证。它非常丑陋。不要这样做。

func ignoreError(val interface {}, err error) interface {} {
    return val
}
Run Code Online (Sandbox Code Playgroud)

在每次调用时ignoreError()都必须将类型转换为预期的返回类型。

游乐场示例