遵循這里推薦的 do..while 模式:
for {
work()
if !condition {
break
}
}
下面的代碼正在使用 for 回圈實作 do..while(condition):
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陳述句的否定(條件)中洗掉否定?
uj5u.com熱心網友回復:
您需要的轉換稱為德摩根定律:
- not (A or B) = (not A) and (not 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
}
需要檢查的一件事:短路評估。在一系列&&if 運算式被評估為false,其余的將不會被評估(我們知道結果是false)。
幸運的是,這在翻譯版本中將保持不變:短路評估將相同,因為在一系列||如果運算式被評估為true,其余的將不會被評估(我們知道結果是true)。因此,當在原來的形式a是false,這是完全一樣的情況下!a是true在變換形式。
uj5u.com熱心網友回復:
如何洗掉if陳述句的否定(條件)中的否定?
完全按照建議(“使用||”)
if !(a && b)
相當于
if !a || !b
有關更多資訊,請參閱德摩根定律。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334896.html
