Go中使用“继续标签”与使用“中断”跳出内循环的区别

Posted

技术标签:

【中文标题】Go中使用“继续标签”与使用“中断”跳出内循环的区别【英文标题】:Difference between using "continue Label" versus using "break" to jump out of inner loop in Go 【发布时间】:2014-05-04 22:41:05 【问题描述】:

为了跳出内循环,继续外循环,我们可以使用continue Labelbreak

这是来自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
            
        
    

使用break 可以达到相同的结果,如下所示: http://play.golang.org/p/0YUjkdxxRE

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
        
    

Go 中哪种方式更惯用?

【问题讨论】:

【参考方案1】:

我不知道是否有任何被广泛接受的标准可供使用。但是请注意,这两者等效。

拍摄:

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!")

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!")

如果breakcontinue 被击中,前者会打印“多余的行!”,而后者不会。您使用哪个很大程度上取决于您是否希望在内部循环终止后执行外部循环中的代码。如果不存在这样的代码,那么很大程度上取决于您是否认为自己会在那里添加代码。

请记住您在代码中语义所说的内容。一个是说“我希望 外部循环 进行下一次迭代(或者如果不存在则退出)”。另一个是说“我希望 this 循环退出”。总的来说,我认为大多数人发现,尽可能影响和考虑最局部范围的代码通常是最清晰的。出于这个原因,除非有必要,否则我会避免使用“继续”标签,但我认为无论哪种方式,这都不是一种极大的侮辱。

【讨论】:

以上是关于Go中使用“继续标签”与使用“中断”跳出内循环的区别的主要内容,如果未能解决你的问题,请参考以下文章

举例说明c语言中的中断语句break,continue,return的区别及相同之处

Js跳出循环

Go 关键字

foreach跳出循环不往下走

3.8.6 中断控制流程语句

Go之break和continue