Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何忽略GO中返回的错误_Go - Fatal编程技术网

如何忽略GO中返回的错误

如何忽略GO中返回的错误,go,Go,我今天开始学围棋。 有一件事让我抓狂,那就是err返回的参数 假设我需要嵌套几个函数。像这样: return string(json.Marshal(MyData)) 或更复杂的示例: return func1(func2(func3(MyData))) 是否真的有必要写: tmp1 , _ = func3(MyData) tmp2 , _ = func2(tmp1) tmp3 , _ = func1(tmp2) return tmp3 真烦人 有没有办法让代码看起来更干净?可以定义一个忽

我今天开始学围棋。
有一件事让我抓狂,那就是
err
返回的参数

假设我需要嵌套几个函数。像这样:

return string(json.Marshal(MyData))
或更复杂的示例:

return func1(func2(func3(MyData)))
是否真的有必要写:

tmp1 , _ = func3(MyData)
tmp2 , _ = func2(tmp1)
tmp3 , _ = func1(tmp2)
return tmp3
真烦人

有没有办法让代码看起来更干净?

可以定义一个忽略错误的函数,但是Go缺少泛型,因此您必须到处使用接口{}和类型转换,在这个过程中失去了typechecker的许多静态保证。非常难看。不要这样做

func ignoreError(val interface {}, err error) interface {} {
    return val
}
每次调用
ignoreError()
时,都必须将类型转换为预期的返回类型

真正的答案是:不要

永远不要忽视错误

真的。这些错误的存在是有原因的。如果函数返回错误, 这几乎总是意味着,在你的程序运行期间, 即使它100%没有bug,函数也会失败。如果是的话, 你通常不想继续下去,就好像什么都没发生一样

如果您完全确定使用函数的方式确保它不会返回非零错误(除非程序中存在错误,而且总是存在错误),那么您可能需要编写一个
必须
风格的函数,如

错误处理不是噪音。这不是杂乱。这不是你想要的东西 摆脱。如果看起来你的程序有50%是错误的
处理,这是因为程序的50%是并且应该是错误处理。

您经常看到的一种可能的抽象模式是使用通用错误处理程序

这并不能阻止您处理错误值,但它可以将错误处理从代码的其余部分中抽象出来

注意,像这样的抽象被认为是“非惯用的”,而“纯粹的”方法是显式地就地处理错误。不过,这种恐慌驱动的替代方案仍然非常有用,特别是对于快速原型化一个只想将所有错误转储到控制台或日志文件中的脚本

对于可重用的包,我会坚持使用详细的显式方式,因为其他人会期望产生错误的函数实际返回错误值,而不是使用紧急恢复机制

主程序包
进口(
乌提尔斯
)
func main(){
延迟函数(){
utils.Handle(func(err-error){
//以通用方式处理错误,
//例如,使用println或写入http
})
}()
var result,err:=someFragileFunction()
检查(错误)
}
包utils
功能检查(错误){
如果错误!=零{
恐慌(错误)
}
}
func句柄(处理程序func(错误)){
如果r:=recover();r!=nil{
如果错误,则ok:=r.(错误);ok{
处理程序(错误)
}否则{
恐慌(r)
}
}
}

简短回答:不要忽略GoYes中的错误是的,有一种方法可以让它更干净:添加错误处理。忽略错误与干净的代码完全相反。简单地说“不要…”并不能回答这个问题,尽管标题和帖子并没有问完全相同的问题。我不得不说,添加错误处理并不能使代码“更干净”,只能使代码更健壮。然而,OP可能只是在玩游戏,或者处理一些简单的一次性脚本任务。或者仅仅因为他能承受潜在的后果。无论如何,OP的原始问题是有效的。Rust和Haskell都提供了将错误留给运行时处理的方法(在Rust中,
unwrap
;在Haskell中,这取决于您使用的错误处理机制)。感谢您的建议,我将尝试遵循它。GO的思维方式可能与PHP-JS不同。除了文档明确指出函数返回
nil
:例如
strings.WriteString()
:“WriteString将s的内容附加到b的缓冲区。它返回s的长度和nil错误。”这不是对问题的回答,而是一种意见。有合理的理由忽略错误值。绝对同意@SkyKelsey。教条式的纯粹主义不值得骄傲。绝对可以忽略测试中的错误,恐慌是可以的。Ergo httptest.NewRequest(与http.NewRequest相同,只是它将死机而不是错误)用于测试。