回答

收藏

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

技术问答 技术问答 222 人阅读 | 0 人回复 | 2023-09-12

我目前正在学习 go,我的一些代码如下所示:  T" K4 s6 N7 J5 ~; e
    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 ...& G5 Y7 ^# N, q- G8 s
这对我来说似乎有点错误,因为错误的检查需要大部分的线路。有更好的方法来处理错误吗?我能通过一些重建来避免这种情况吗?* G% T1 k: L+ F& l! X. O
更新:谢谢你所有的回答。请注意,在我的例子中,doB 取决于 a,doC 取决于 b,以此类推。因此,在这种情况下,大多数建议的重构都不起作用。还有什么建议吗?
, B! T) u9 z/ |1 A" a                                                               
3 c3 w  ~8 X" P9 q2 C, {    解决方案:                                                                8 Y( B8 s# B2 F9 ^
                                                                这是一个常见的抱怨,有很多答案。
# o# q: M) v% r) M以下是常见的:
9 Z2 [1 X& R. D7 Q% |/ F1 - 还不错2 ]# d# U) o  Z/ U
这是对这些投诉的一种非常普遍的反应。事实上,你的代码中有几行额外的代码并没有那么糟糕。这只是一点便宜的打字,在阅读中很容易处理。
+ m2 W5 }( _7 w( @' H2 - 这其实是一件好事
- ?4 X. @; Q5 G* A. _5 o这是基于这样一个事实,即输入和阅读这些额外的线是一个很好的提醒,事实上,你的逻辑可能会在那个时候逃跑,你必须取消任何资源管理放置在它之前的线。这通常是与异常相比提出的,它可以隐藏地破坏逻辑过程,迫使开发人员永远记住隐藏的错误路径。4 ?7 _* S1 B& C; z
3 - 使用恐慌/恢复8 m4 c; F  ]$ e1 C3 @: ^1 V
在某些情况下,您可以使用它panic避免某些工作的已知类型recover在发布您的包代码之前,将其转换为正确的错误并返回。这种技术最常用于扩展递归逻辑,如 (un) marshalers。
' A! R% T# [( ~+ W个人尽量不要滥用这一点,因为我和第 1 点和第 2 点的关系更密切。
! o4 n% r, V* T9 A/ o4 - 稍微重组代码
# T/ e8 Y0 Q1 {3 {在某些情况下,你可以稍微重新组织逻辑,以避免重复。
1 V& [. |* p" R8 s; A/ ?这是一个简单的例子:
1 |4 C6 m2 F( o5 c
    err := doA()if err != nil    return err}err := doB()if err != nil    return err}return nil0 A/ N/ z8 m0 U; P* \7 q: g% Z3 U& e
也可组织为:2 l0 n6 q* n8 W/ L# J6 ], Z. [( t
    err := doA()if err != nil    return err}return doB()
    ; F5 f+ G, P1 A6 K: X, }2 a
5 - 使用命名结果
- i6 J& T! A) p有些人使用命名结果从 return 在句子中去除 err 变量。然而,我建议不要这样做,因为它节省了很少的代码,降低了代码的清晰度,当一个或多个结果多个结果之前,逻辑很容易出现微妙的问题。
5 d6 U* w- B! W  X$ _1 ^; r6 - 在 if 条件前使用句子
% n9 Z" }$ T0 y3 T' J4 \正如 Tom Wilde 在下面的评论中很好地提醒的那样,ifGo 中的句子在条件之前接受一个简单的句子。所以你可以这样做:
; {0 C6 _- W- t; G2 x  Y& O* ]
    if err := doA(); err != nil    return err}
    / ^1 m$ j3 r1 z  P% k7 p
这是一个很好的 Go 习语,并经常使用。
! L9 n) p2 I2 [5 ]在某些情况下,我宁愿避免这样嵌入句子,只是为了让它独立,但这是一件微妙而个人的事情。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则