前言

比如这样的需求, 遍历一个 切片, 切片内容是切片1, 需求是判断切片1中某个是否有相应数据, 有就返回

正文

我们需要考虑的是在写两层遍历时如何在获取结果后结束这两层遍历

变量法

设置一个变量, 在外层监听该变量, 获取到结果后修改该变量

func main() {
t := [][]int{{1, 2, 3, 4, 5}, {5, 6, 7, 8, 9}}
s := false
for _, v := range t {
for _, v1 := range v {
if v1 == 5 {
s = true // 判断成立修改标量退出二层循环
break
}
}
if s { // 检测标量结果,为true代表命中
break
}
}
}

缺点很明显, 如果套更多层需要在每个层都写一个判断标量的逻辑一层层退出

goto

func main() {
t := [][]int{{1, 2, 3, 4, 5}, {5, 6, 7, 8, 9}}
for _, v := range t {
for _, v1 := range v {
if v1 == 5 {
goto Loop // 跳转到注册名为Loop的标记处,中间的代码直接跳过
}
}
}
fmt.Println("nil")
return // 此处return防止继续执行loop的代码
Loop: // Loop标记处, Loop只是一个标记,正常顺序执行也会执行Loop的代码,,一般叫Loop,可以自定义,与上面一致即可
fmt.Println("success")
}

此方法不止适用于循环,实际上他可以贴在任意地方,比如

func main() {
fmt.Println(1)
goto Loop
fmt.Println(2)
Loop:
fmt.Println(3)
}

上面的 2 永远不会打印

这种方法的问题是会破坏正常的代码结构, 一个项目的代码必定是很多的, 有很多逻辑, 使用goto会破坏原有的代码结构, 大大降低了可读性和可维护性, 因此请尽可能的避免使用 goto

break Label

给某一层循环设置一个Label,指定跳过某一个Label

func main() {
t := [][]int{{1, 2, 3, 4, 5}, {5, 6, 7, 8, 9}}
s := false
Loop: // 标记该循环为Loop,一般叫Loop,可以自定义,与下面一致即可
for _, v := range t {
for _, v1 := range v {
if v1 == 5 {
s = true
break Loop // 跳出Loop标记的循环
}
}
}
if s {
fmt.Println("success")
}
}

相比于 goto, break Label 只能在循环中使用, Loop只能注册到循环中, goto是跳转到某行执行, break是跳出Loop标记的循环,相对来说限制大一些, 没有那么随意, 而相比于 方法一,则无需写多层判断, 需要注意的是, break Label 的 Label 不一定是顶层, 可以在任意一层

func main() {
t := [][][]int{{{1, 2, 3, 4, 5}}, {{5, 6, 7, 8, 9}}}
s := false
for _, v := range t {
Loop: // 标记该循环为Loop
for _, v1 := range v {
for _, v2 := range v1 {
if v2 == 5 {
s = true
break Loop // 跳出Loop标记的循环
}
}
}
}
if s {
fmt.Println("success")
}
}

单独写一个函数

这个不多说, 因为 return 直接退出函数了

func t1(t [][][]int) bool {
for _, v := range t {
for _, v1 := range v {
for _, v2 := range v1 {
if v2 == 5 {
return true
}
}
}
}
return false
} func main() {
t := [][][]int{{{1, 2, 3, 4, 5}}, {{5, 6, 7, 8, 9}}}
fmt.Println(t1(t))
}

总结

条条大路通罗马, 其实哪种都可以, 但是我还是推荐使用函数的形式, 因为goto和lable或多或少都会降低可读性. 何况, 如果真的出现多个循环在一个函数, 应该思考是不是设计的有问题或者实现的有问题.

go跳出多层循环的几种方式的更多相关文章

  1. js for等循环 跳出多层循环

    js for 循环 跳出多层循环 ,,,,,,,]; // 8个数 ,,,,,,,]; //8个数 testFor(); console.log(') function testFor() { ;k& ...

  2. java的break跳出多层循环

    记得大一的时候,语言学的不好,碰到了需要跳出双层循环的时候,就没有了办法.因为老师讲了goto然后说不要用goto...  自己就一直感觉这种跳出多层循环的想法是不可取的(好蠢) 下面用java代码的 ...

  3. python基础代码(猜年龄、从最内层跳出多层循环、简单的购物车程序)

    1.猜年龄 , 可以让用户最多猜三次! age = 55 i=0 while i<3: user_guess = int (input ("input your guess:" ...

  4. python(3)- 循环语句:从最内层跳出多层循环

    跳出多层循环:三层循环,最里层直接跳出3层 方法一: 在Python中,函数运行到return这一句就会停止,因此可以利用这一特性,将功能写成函数,终止多重循环 def work(): #定义函数 f ...

  5. python练习-跳出多层循环和购物车

    跳出多层循环:三层循环,最里层直接跳出3层 在Python中,函数运行到return这一句就会停止,因此可以利用这一特性,将功能写成函数,终止多重循环 def work(): for i in ran ...

  6. JAVA如何跳出多层循环

    1. break.continue.return 的区别: break默认是跳出最里层的循环,也就是break所在的最近的那层循环 continue是终止本次循环,继续下次循环 return 结束当前 ...

  7. 盘点用jQuery框架实现“for循环”的四种方式!

    摘要:分享在jQuery高级开发中对元素标签体的遍历常用的几种方法. 本文分享自华为云社区<盘点用jQuery框架实现"for循环"的四种方式!>,原文作者:灰小猿 . ...

  8. 关于python如何简单跳出多层循环

    上述代码的逻辑是,在跳出子循环之前定义一个变量flag为Ture,第一层循环跳出之后,如果要跳出第二个循环,直接调用变量flag,可以直接跳出第二层循环.这里要注意的是缩进,不然会出错误. 如果是多层 ...

  9. python中从内部循环直接跳出多层循环

    学习循环的时候碰到一道题,需要从内部循环中直接跳出所有循环,想了很久终于想到一种好办法(小白认知) 题目为:使用while循环输出100-50,从大到小,到50时,再循环输出0-50,从小到大. ex ...

随机推荐

  1. BJOI2017 机动训练

    落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...

  2. Python使用requests发送请求

    Python使用第三方包requests发送请求,实现接口自动化 发送请求分三步: 1.组装请求:包括请求地址.请求头header.cookies.请求数据等 2.发送请求,获取响应:支持get.po ...

  3. AWT07-菜单组件

    1.菜单组件 方法名 说明 MenuBar 菜单条,菜单的容器 Menu 菜单组件,菜单项的容器,也是MenuItem的子类,所以可以作为菜单项使用 PopupMenu 上下文菜单组件(右键菜单组件) ...

  4. Unity 操作快捷键

            Q Hand(手形)工具 可以平移整个Scene视图       W Translate(移动)工具 移动所选择的游戏对象       E Rotate(旋转)工具 按任意角度旋转游戏 ...

  5. MySQL高级部分理论知识细讲

    文章目录 一.数据库分区.分表.分库.分片 YesOk ,大家好 ,我是小刘,许久不见,甚是想念 ,小刘今天来带大家学习 分库分表的基础知识 1.1 单机数据库的瓶颈 单个表数据量越大,读写锁,插入操 ...

  6. luabind 使用

    LuaBind --最强大的Lua C++ Bind 转载:http://www.cppblog.com/deane/articles/49208.html1 介绍LuaBind 是一个帮助你绑定C+ ...

  7. Nginx-rtmp+ FFmpeg +Docker + vue.js 直播系统搭建

    思路(如图): 1,开启推流服务器(这里我的Nginx-rtmp服务器搭建成功) 进入docker 开启推流服务器  docker run -it -p 1935:1935 -p 8000:80 -- ...

  8. Java 从 Map 到 HashMap 的一步步实现

    Java 从 Map 到 HashMap 的一步步实现 一. Map 1.1 Map 接口 在 Java 中, Map 提供了键--值的映射关系.映射不能包含重复的键,并且每个键只能映射到一个值. 以 ...

  9. 作为Java新手,如何才能快速的看透一个Java项目?

    前言 技术学习是一个总结.纠错.触类旁通的过程,而不是单纯重复练习的过程,如果你问一个做过5年以上Java的老码农,他们很多人都会有很强的"搬砖感",这种"搬砖感&quo ...

  10. Python的一个mysql实例

    按公司名统计一定时期内入货的总车数,总重量还有总价格.数据表如下: 要用到的库是pymysql,读取excel表格的xlrd,写入excel的xlwt和复制excel模板的xlutils,代码如下: ...