为了跳出内循环并继续外循环,我们可以使用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!")
}
如果 break
或 continue
被击中,前者将打印“多余的行!”,而后者则不会。您使用哪个很大程度上取决于您是否希望外循环中的代码在您的内循环终止后执行。如果不存在这样的代码,那么这在很大程度上取决于您是否认为您会在那里添加代码。
请记住您在代码中说的语义。一个是说“我希望外循环进入下一次迭代(如果不存在则退出)”。另一个是说“我希望这个循环退出”。总的来说,我认为大多数人发现影响和考虑的代码,尽可能地,最局部的范围通常是最清晰的。出于这个原因,除非有必要,否则我会避免使用 continue 标签,但我认为无论哪种方式,这都不是一种极大的侮辱。
关于for-loop - Go中使用 "continue Label"和使用 "break"跳出内循环的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462390/