遵循此处推荐的do..while模式:
for {
work()
if !condition {
break
}
}
下面的代码是实现do..while(条件)使用for循环:
var r *s
var err error
counter := 0
for { // do..while(specificerror && < MAX && trigger_not_initiated)
r, err = f()
counter = counter + 1
if !(err != nil &&
strings.Contains(err.Error(), "specificerror") &&
counter < MAX &&
!IsTriggerInitiated()) {
break
}
}
但是审查小组建议通过删除if
语句中的否定(条件)来使if条件更具可读性
如何去除if
语句的否定(条件)?
你需要的转化叫做德摩根定律:
- 不是(A或B) = (A)和(B)
- not (A and B) = (not A) or (not B),
如果你有这样的语句:
if !(a && b && c) {}
等于
if !a || !b || !c {}
在你的例子中:
if !(err != nil &&
strings.Contains(err.Error(), "specificerror") &&
counter < MAX &&
!IsTriggerInitiated()) {
break
}
翻译版本:
if err == nil ||
!strings.Contains(err.Error(), "specificerror") ||
counter >= MAX ||
IsTriggerInitiated() {
break
}
需要检查的一件事:短路评估。在一系列&&
中,如果一个表达式求值为false
,则其余表达式将不求值(我们知道结果为false
)。
幸运的是,这将在翻译版本中保持不变:短路计算将是相同的,因为在一系列||
中,如果一个表达式被求值为true
,其余的将不被求值(我们知道结果是true
)。因此,当原始形式a
为false
时,转换后的形式!a
为true
时,情况完全相同。
如何在if语句的否定(条件)中删除否定?
完全按照建议("use||
")
if !(a && b)
等价于
if !a || !b
更多信息请参见De Morgan定律。