go跳出多层循环的几种方式
前言
比如这样的需求, 遍历一个 切片, 切片内容是切片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跳出多层循环的几种方式的更多相关文章
- js for等循环 跳出多层循环
js for 循环 跳出多层循环 ,,,,,,,]; // 8个数 ,,,,,,,]; //8个数 testFor(); console.log(') function testFor() { ;k& ...
- java的break跳出多层循环
记得大一的时候,语言学的不好,碰到了需要跳出双层循环的时候,就没有了办法.因为老师讲了goto然后说不要用goto... 自己就一直感觉这种跳出多层循环的想法是不可取的(好蠢) 下面用java代码的 ...
- python基础代码(猜年龄、从最内层跳出多层循环、简单的购物车程序)
1.猜年龄 , 可以让用户最多猜三次! age = 55 i=0 while i<3: user_guess = int (input ("input your guess:" ...
- python(3)- 循环语句:从最内层跳出多层循环
跳出多层循环:三层循环,最里层直接跳出3层 方法一: 在Python中,函数运行到return这一句就会停止,因此可以利用这一特性,将功能写成函数,终止多重循环 def work(): #定义函数 f ...
- python练习-跳出多层循环和购物车
跳出多层循环:三层循环,最里层直接跳出3层 在Python中,函数运行到return这一句就会停止,因此可以利用这一特性,将功能写成函数,终止多重循环 def work(): for i in ran ...
- JAVA如何跳出多层循环
1. break.continue.return 的区别: break默认是跳出最里层的循环,也就是break所在的最近的那层循环 continue是终止本次循环,继续下次循环 return 结束当前 ...
- 盘点用jQuery框架实现“for循环”的四种方式!
摘要:分享在jQuery高级开发中对元素标签体的遍历常用的几种方法. 本文分享自华为云社区<盘点用jQuery框架实现"for循环"的四种方式!>,原文作者:灰小猿 . ...
- 关于python如何简单跳出多层循环
上述代码的逻辑是,在跳出子循环之前定义一个变量flag为Ture,第一层循环跳出之后,如果要跳出第二个循环,直接调用变量flag,可以直接跳出第二层循环.这里要注意的是缩进,不然会出错误. 如果是多层 ...
- python中从内部循环直接跳出多层循环
学习循环的时候碰到一道题,需要从内部循环中直接跳出所有循环,想了很久终于想到一种好办法(小白认知) 题目为:使用while循环输出100-50,从大到小,到50时,再循环输出0-50,从小到大. ex ...
随机推荐
- 基于.NET的程序读取Excel文件的解决方案
目录 0. 前言 1. 使用NPOI库读取Excel文件 2. 使用OleDbConnection 3. 相关参考 shanzm-2020年12月8日 23:48:11 0. 前言 以前基于 .NET ...
- Java 线程安全问题的本质
原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 目录: 线程安全问题的本质 理解CPU JVM虚拟机类比于操作系统 重排序 汇总 一些解释 ...
- 二、spring cloud 注册与发现eureka注册中心
基于2.0 Greenwich高可用eureka注册中心搭建 一.单机版 新建MAVEN父工程demo-parent 删掉src pom.xml <packaging>pom</pa ...
- 最详细Python批量字典暴力破解zip密码
工具破解 前两天在网上下来了一波项目案例,结果全是加密的压缩包,于是去网上找了一个压缩包破解的工具 苦于工具破解太慢,一个压缩包要好久,解压了三个之后就放弃了,准备另寻他法 密码字典 巧的是破解的三个 ...
- C++模板元编程----选择排序
目录 目录 前言 代码详解 数据的结构 数据的操作 分割向量 合并向量 寻找最大值 排序 总结 前言 模板在C++一直是比较神秘的存在.STL和Boost中都有大量运用模板,但是对于普通的程序员来说, ...
- Spring Cloud Alibaba (一): SpringCloud与SpringBoot版本选型
前言 近年SpringCloud与SpringBoot更新迭代非常频繁,导致我们对两者的版本选型非常的困难.若是版本选择有问题, 会导致开发中调试兼容性占用非常多的得必要时间. SpringClo ...
- Hive JDBC执行load时无法从本地加载数据
通过hive-jdcv连接hive server,在应用服务端执行以下命令,报错:Hiver Server节点上找不到data.txt load data local inpath '/home/dw ...
- 04-flask-模版基础
Jinja2 概念 Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Fl ...
- C++ string常见函数总结
基础概念 对照功能列表:不能直接回答的再去看相应解析说明. begin 得到指向字符串开头的 Iterator end 得到指向字符串结尾的 Iterator rbegin 得到指向反向字符串开头的 ...
- python常见的内置模块
python的内置模块: os os.path sys time datetime hashlib base64 hmac random math 一.os模块: os模块是与操作系统交互的一个接口 ...