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 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
中哪种方式更惯用?
【问题讨论】:
【参考方案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!")
如果break
或continue
被击中,前者会打印“多余的行!”,而后者不会。您使用哪个很大程度上取决于您是否希望在内部循环终止后执行外部循环中的代码。如果不存在这样的代码,那么很大程度上取决于您是否认为自己会在那里添加代码。
请记住您在代码中语义所说的内容。一个是说“我希望 外部循环 进行下一次迭代(或者如果不存在则退出)”。另一个是说“我希望 this 循环退出”。总的来说,我认为大多数人发现,尽可能影响和考虑最局部范围的代码通常是最清晰的。出于这个原因,除非有必要,否则我会避免使用“继续”标签,但我认为无论哪种方式,这都不是一种极大的侮辱。
【讨论】:
以上是关于Go中使用“继续标签”与使用“中断”跳出内循环的区别的主要内容,如果未能解决你的问题,请参考以下文章