for-loop - Go中使用 "continue Label"和使用 "break"跳出内循环的区别

标签 for-loop go nested-loops break continue

为了跳出内循环并继续外循环,我们可以使用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
            }
        }
    }

同样的结果可以通过使用 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 中更地道?

最佳答案

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

采取:

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

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

关于for-loop - Go中使用 "continue Label"和使用 "break"跳出内循环的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462390/

相关文章:

C++11 for 循环语法不能正常工作

google-app-engine - 通过 yaml 规则限制登录用户访问 google app engine app 中的静态文件失败

go - ioutil.WriteFile 文件模式/权限常量是否存储在任何地方?

cuda - 嵌套循环中数组的二维累积和——CUDA 实现?

C 控制流,内存分配 : Abort trap 6, 用字符串中的字符填充数组,嵌套 for 循环

java - Ramining 数组 - 如果包含 "true"

for循环的javascript功能/声明版本(用这个例子)?

C中的循环条件检查

pointers - 如何在 Go 中强制将参数作为指针传递?

c - 4 个嵌套 'for' 循环的最佳和最坏情况时间复杂度?