使用"继续标签"与使用"break"跳出Go中的内循环之间的区别

Min*_*gyu 1 for-loop continue break go nested-loops

为了跳出内循环,并继续外循环,我们可以使用continue Label或使用break.

以下是来自http://www.goinggo.net/2013/11/label-breaks-in-go.html的示例

原帖是使用continue Label模式:

    guestList := []string{"bill", "jill", "joan"}
    arrived := []string{"sally", "jill", "joan"} 

CheckList:
    for _, guest := range guestList {
        for _, person := range arrived {
            fmt.Printf("Guest[%s] Person[%s]\n", guest, person)

            if person == guest {
                fmt.Printf("Let %s In\n", person)
                continue CheckList
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

通过使用可以实现相同的结果break,如下所示:http: //play.golang.org/p/0YUjkdxxR​​E

guestList := []string{"bill", "jill", "joan"}
arrived := []string{"sally", "jill", "joan"}

for _, guest := range guestList {
    for _, person := range arrived {
        fmt.Printf("Guest[%s] Person[%s]\n", guest, person)

        if person == guest {
            fmt.Printf("Let %s In\n", person)
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪种方式比较惯用Go

Lin*_*ope 5

我不知道是否有任何广泛接受的标准可供使用.但请注意,这两者并不相同.

采取:

for _,guest := range guestList {
    for _,person := range arrived {
        fmt.Printf("Guest[%s] Person[%s]\n", guest, person)

        if person == guest {
            fmt.Printf("Let %s In\n", person)
            break
        }
    }
    fmt.Println("Superfluous line!")
}
Run Code Online (Sandbox Code Playgroud)

VS

OuterLoop:
for _,guest := range guestList {
    for _,person := range arrived {
        fmt.Printf("Guest[%s] Person[%s]\n", guest, person)

        if person == guest {
            fmt.Printf("Let %s In\n", person)
            continue OuterLoop
        }
    }
    fmt.Println("Superfluous line!")
}
Run Code Online (Sandbox Code Playgroud)

如果break或被continue击中,前者将打印"多余的线!",而后者则不会.你使用哪个很大程度上取决于你是否希望在内循环终止后执行外循环中的代码.如果不存在这样的代码,那么它在很大程度上取决于您是否认为您将在那里添加代码.

请记住您在代码中的语义.一个人说"我希望外循环进入下一次迭代(如果不存在则退出)".另一个是说"我希望这个循环退出".总的来说,我认为大多数人发现尽可能地影响和考虑最本地范围的代码通常是最清楚的.出于这个原因,除非有必要,否则我会避免标记为继续,但我不认为这是一种伟大的圣洁侮辱.