如何打破 Go 中的嵌套循环?

新手上路,请多包涵

我有一个外循环和内循环,每个循环都在一个范围内迭代。我想在内循环中满足条件时退出外循环。

我有一个使用两个“中断”的解决方案,一个在内部循环内,一个在外部循环内,就在内部循环之外(一个非常简化的演示案例):

 package main

import (
    "fmt"
)

func main() {

    word := ""
    for _, i := range("ABCDE") {
        for _,j := range("ABCDE") {
            word = string(i) + string(j)
            fmt.Println(word)
            if word == "DC" {
                break
            }
        }
        if word == "DC" {
            break
        }
    }
    // More logic here that needs to be executed
}

去游乐场

这个解决方案没有问题,但对我来说它看起来很丑陋。有一个更好的方法吗?

我可以尝试在之前的解决方案中的外循环之外设置另一个 for 条件循环,并使用标签继续使用标签。但如您所见,这种方法并不比使用 break 的解决方案更优雅。

 package main

import (
    "fmt"
)

func main() {

    word := ""

Exit:
    for word != "DC" {
        for _, i := range "ABCDE" {
            for _, j := range "ABCDE" {
                word = string(i) + string(j)
                fmt.Println(word)
                if word == "DC" {
                    continue Exit
                }
            }
        }
    }
    // More logic here that needs to be executed
}

去游乐场

我在这里看到了与其他语言(C、C#、Python 等)有关的类似问题。但我真正感兴趣的是 Go 结构是否有任何技巧,例如“for select”。

原文由 Jay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 714
2 个回答

使用功能

package main

import (
    "fmt"
)

func getWord() string {
    word := ""
    for word != "DC" {
        for _, i := range "ABCDE" {
            for _, j := range "ABCDE" {
                word = string(i) + string(j)
                fmt.Println(word)
                if word == "DC" {
                    return word
                }
            }
        }
    }
    return word
}

func main(){
    word := getWord()
}

编辑:感谢 @peterSO,他指出了细节中的一些错误并提供了这个游乐场 https://play.golang.org/p/udcJptBW9pQ

原文由 kkesley 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 break {label} 根据需要跳出任何嵌套的循环。只需将标签放在要跳出的 for 循环 之前。这与执行 goto {label} 的代码非常相似,但我认为更优雅一点,但我想是见仁见智。

 package main

func main() {
    out:
    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if i + j == 20 {
                break out
            }
        }
    }
}

更多详情: https ://www.ardanlabs.com/blog/2013/11/label-breaks-in-go.html

原文由 lazieburd 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题