我有以下情况:
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
?
有没有一种方法可以“打破”nestedCondition 但也能够检查 otherCondition?
没有。
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(以及大多数语言)中极为罕见,并且不应该“过度使用”(或根本不使用)。
您可以扁平化 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 子句越少越容易阅读。或者您可以按照其他帖子中的建议隐藏函数中的复杂性。
可能会让你失望,但 if 子句没有中断标记 😭。要么尝试将逻辑分离到一个函数中并在某个点返回,要么重构 if 子句:)
虽然实现您想要做的事情的正确方法是重组您的流程,但这可能是使用
goto
的合适案例。
if condition {
if nestedCondition {
// logic
goto otherCondition
}
if otherNestedCondition {
// logic
}
}
otherCondition:{
//logic
}
您可以查看Golang规范-goto声明
使用 不使用条件开关的有效替代方案:
if condition {
switch {
case nestedCondition:
// logic
case otherNestedCondition:
// logic
}
}
if otherCondition {
// logic
}