gpt4 book ai didi

go - 避免检查错误是否是零重复?

转载 作者:IT老高 更新时间:2023-10-28 12:58:45 25 4
gpt4 key购买 nike

我目前正在学习围棋,我的一些代码如下所示:

a, err := doA()
if err != nil {
return nil, err
}
b, err := doB(a)
if err != nil {
return nil, err
}
c, err := doC(b)
if err != nil {
return nil, err
}
... and so on ...

这对我来说看起来有点不对,因为错误检查占用了大部分行。有没有更好的方法来进行错误处理?我可以通过一些重构来避免这种情况吗?

更新:感谢您的所有回答。请注意,在我的示例中,doB 取决于 a,doC 取决于 b,依此类推。因此,大多数建议的重构在这种情况下都不起作用。还有什么建议吗?

最佳答案

这是一个常见的提示,有几个答案。

以下是一些常见的:

1 - 还不错

这是对这些投诉的一种非常常见的 react 。您的代码中有几行额外的代码实际上并没有那么糟糕。这只是一种廉价的打字方式,并且在阅读方面非常容易处理。

2 - 这其实是件好事

这是基于这样一个事实,即键入和阅读这些额外的行是一个很好的提醒,实际上您的逻辑可能会在此时逃脱,并且您必须撤消在这些行中设置的任何资源管理在它之前。与异常相比,这通常会被提出,异常会以隐含的方式破坏逻辑流程,从而迫使开发人员始终牢记隐藏的错误路径。前段时间我写了一篇关于这个here的更深入的咆哮。 .

3 - 使用 panic/recover

在某些特定情况下,您可以通过使用已知类型的 panic,然后在您的包代码进入世界,将其转换为适当的错误并返回。这种技术最常用于展开递归逻辑,例如 (un)marshaler。

我个人尽量不过度滥用这一点,因为我与第 1 点和第 2 点的关联更紧密。

4 - 稍微重新组织一下代码

在某些情况下,您可以稍微重新组织逻辑以避免重复。

举个简单的例子,这个:

err := doA()
if err != nil {
return err
}
err := doB()
if err != nil {
return err
}
return nil

也可以组织为:

err := doA()
if err != nil {
return err
}
return doB()

5 - 使用命名结果

有些人使用命名结果从 return 语句中去除 err 变量。不过,我建议不要这样做,因为它节省的资源很少,降低了代码的清晰度,并且当在 bail-out return 语句之前定义了一个或多个结果时,逻辑容易出现微妙的问题。

6 - 使用 if 条件之前的语句

正如 Tom Wilde 在下面的评论中提醒的那样,Go 中的 if 语句 accept a simple statement条件之前。所以你可以这样做:

if err := doA(); err != nil {
return err
}

这是一个很好的围棋成语,并且经常使用。

在某些特定情况下,我宁愿避免以这种方式嵌入声明,只是为了让它独立起来,以便清楚起见,但这是一件微妙而个人化的事情。

关于go - 避免检查错误是否是零重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18771569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com