在 Go 中中断 if 语句的简洁方法

问题描述 投票:0回答:6

我有以下情况:

if condition {
  if nestedCondition {
    // logic
    // I want to somehow break at this point but also be able
    // to check the outer otherCondition
  }
  if otherNestedCondition {
    // logic
  }
}
if otherCondition {
  //logic
}

有没有一种方法可以从

nestedCondition
“打破”,但也能够检查
otherCondition

go
6个回答
13
投票

有没有一种方法可以“打破”nestedCondition 但也能够检查 otherCondition?

没有。


9
投票

break
语句仅从
for
switch
select
中断。没有break语句可以从
if
或任意中中断。如果可能的话,重组和重新安排你的条件,这样你就不会最终陷入想要摆脱
if
的境地。

您还可以使用一个函数(匿名或命名函数),并在您想要“中断”时从该函数返回:

if condition {
    func() {
        if nestedCondition {
            // To break:
            return
        }
        if otherNestedCondition {
            // logic
        }
    }()
}
if otherCondition {
    //logic
}

另一种解决方案是使用

goto
labeled 语句:

    if condition {
        if nestedCondition {
            // To break:
            goto outside
        }
        if otherNestedCondition {
            // logic
        }
    }
outside:
    if otherCondition {
        //logic
    }

尽管请注意,使用

goto
在 Go(以及大多数语言)中极为罕见,并且不应该“过度使用”(或根本不使用)。


1
投票

您可以扁平化 if 子句:

if a {
    if b {
       // do stuff
       // this is where we want to "break"
    }
    if c {
       // do other stuff
    }
}
if d {
   // do even more stuff
}

可以变成

e := true
if a && b {
   // do stuff
   e = false
}
if a && c && e { // this will get skipped if e is false
   // do other stuff
}
if d {
   // do even more stuff
}

一般来说,嵌套的 if 子句越少越容易阅读。或者您可以按照其他帖子中的建议隐藏函数中的复杂性。


0
投票

可能会让你失望,但 if 子句没有中断标记 😭。要么尝试将逻辑分离到一个函数中并在某个点返回,要么重构 if 子句:)


0
投票

虽然实现您想要做的事情的正确方法是重组您的流程,但这可能是使用

goto
的合适案例。

if condition {
  if nestedCondition {
    // logic
    goto otherCondition
  }
  if otherNestedCondition {
    // logic
  }
}

otherCondition:{
  //logic
}

您可以查看Golang规范-goto声明


0
投票

使用 不使用条件开关的有效替代方案:

if condition {
    switch {
        case nestedCondition:
            // logic
        case otherNestedCondition:
            // logic
    }
}
if otherCondition {
    // logic
}
© www.soinside.com 2019 - 2024. All rights reserved.