跳出多层循环,goto语句助你一臂之力

简介: 跳出多层循环,goto语句助你一臂之力

/ Go 语言 goto 语句详解 /

Go 语言中 goto 语句可以无条件跳转到指定标签,实现修改代码执行流程的效果。合理利用 goto 可以简化代码逻辑,编写更灵活程序。

本文将具体介绍 Go 语言 goto 语句的用法,内容涵盖:

  1. goto 基本语法
  2. 在 for 循环内使用 goto 跳出循环
  3. 使用 goto 从多层嵌套中退出
  4. goto 与函数和 defer 语句
  5. 基于条件判断的 goto 语句
  6. goto 在错误处理中的应用
  7. goto 语句的优缺点
  8. 使用 goto 的最佳实践

1

 

1. goto 基本语法

Go 语言 goto 语句的语法如下:

goto label
...
label:
  语句

当执行到 goto 语句时,程序会跳转到标签 label 所指定的代码行,继续向下执行语句。

2

 

2. 在 for 循环内使用 goto

goto 经常用在循环内,通过无条件跳转来退出循环:

func foo() {
  for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
      if j == 5 {
        goto breakHere
      }
    }
  }
breakHere:
  fmt.Println("跳出了循环")
}

上面例子中,goto 使程序立即跳转到 breakHere 标签处,避免了多层嵌套 break 语句。

3

 

3. 从多层循环退出

对于多层嵌套循环,goto 语句可以非常方便地跳出最外层:

for i := 0; i < 3; i++ {
  for j := 0; j < 5; j++ {
    for k := 0; k < 7; k++ {
      if k == 3 {
        goto breakAll 
      }
    }
  }
}
breakAll:
fmt.Println("跳出所有循环")

通过 goto breakAll 可以立即跳出多层 for 循环,程序执行了简化。

4

 

4. goto 与函数和 defer

goto 语句不能跳入函数内部,但可以在函数内跳转:

通过 goto breakAll 可以立即跳出多层 for 循环,程序执行了简化。
4
4. goto 与函数和 defer
goto 语句不能跳入函数内部,但可以在函数内跳转:

函数内可以定义标签、调用 goto 完成跳转。

defer 语句也会正常执行:

func main() {
  defer fmt.Println(" deferred")
  goto end
end:
  fmt.Println("end") 
} 
// 输出:
// deferred
// end

5

 

5. 条件跳转

很多时候 goto 需要配合条件判断来实现有选择的跳转:

for i := 0; i < 5; i++ {
  if i == 3 {
    goto label
  }
}
label: 
  fmt.Println("跳转到label")

如果条件满足才执行 goto 跳转,这提供了很灵活的控制流方式。

6

 

6. 错误处理

goto 经常用在错误处理中,跳出正常流程直接进行错误处理:

func main() {
  if err := init(); err != nil {
    goto onError
  }
  // do work
  onError:
    handleError(err)  
}

这种方式可以避免执行后续的无关代码。

7

 

7. goto 优缺点

goto 语句有以下特点:

优点:

  • 跳出复杂循环简单方便
  • 处理错误简洁
  • 控制流灵活

缺点:

  • 滥用会使代码混乱
  • 降低代码可读性
  • 不符合结构化编程

8

 

8. 最佳实践

goto 使用的一些最佳实践:

  • 保持简单直观的控制流,避免多层嵌套跳转
  • 主要用在从深层循环退出或者错误处理
  • 配合条件判断使用 goto,不要盲目跳转
  • 使用 speak style 命名标签
  • 不要用 goto 来完成结构化编程可以实现的逻辑

一个良好的例子:

func main() {
  for { 
    if err := doWork(); err != nil {
      goto onError
    }
  }
  onError:
    log.Println(err)
    os.Exit(1)
}
func doWork() error {
  // do something
  return nil  
}

9

 

9. 总结

通过本文,我们全面介绍了 Go 语言中的 goto 语句,包括语法、用法及优缺点。合理利用 goto 可以简化代码逻辑,编写灵活的控制流。但我们也应当规避滥用 goto,保持代码的整洁可读性。


目录
相关文章
|
机器学习/深度学习 自然语言处理
文生图模型-Stable Diffusion | AIGC
所谓的生成式模型就是通过文本或者随机采样的方式来得到一张图或者一段话的模型,比如文生图,顾名思义通过文本描述来生成图像的过程。当前流行的文生图模型,如DALE-2, midjourney以及今天要介绍的Stable Diffusion,这3种都是基于Diffusion扩散模型【1月更文挑战第6天】
2356 0
|
传感器 算法
【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪
【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪
1671 0
|
6月前
|
人工智能 自然语言处理 架构师
智能体来了:AI时代的下一个风口,你准备好了吗?
AI智能体时代已至,从技术变革到职业重塑,正催生全新机遇。“智能体来了”作为国内领先AI职业教育平台,携手顶尖专家,推出覆盖青少年、大学生、企业家的实战课程,助力零基础学员成为智能体创作者。通过“理论+实战+项目孵化+就业直通”模式,手把手教你打造专属智能体IP,掌握AI时代核心竞争力。现已发布“百事通智能体”等实训案例,支持多平台部署。结业获认证证书,对接高薪岗位,赋能个人与企业抢占AI红利。智能体不是未来,是现在。你,准备好了吗?(239字)
|
JavaScript 编译器 开发工具
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
732 2
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
前端开发 JavaScript Java
屎上最全vue-pdf+Springboot与aspose-words整合,开箱即用
本文详细介绍了如何通过Spring Boot与Aspose Words整合实现Word模板的填充及转换为PDF,并在前端使用Vue和javadog-vue-pdf实现PDF预览与下载。主要内容包括:实现Spring Boot与Aspose Words的整合,完成Word模板填充并转换为PDF;前端Vue集成javadog-vue-pdf进行PDF预览及下载。文章提供了详细的步骤说明,包括下载依赖、配置代理、代码示例等,并展示了最终成果。
1459 7
屎上最全vue-pdf+Springboot与aspose-words整合,开箱即用
|
机器学习/深度学习 并行计算 计算机视觉
CUDA:王者之巅——探究CUDA为何能成为并行计算的佼佼者
本文探讨了CUDA在并行计算领域的崛起及其成为佼佼者的原因,详细介绍了CUDA的技术背景、架构原理及在深度学习、图像处理等领域的应用案例,展示了其显著的性能优势与优化方法,并展望了CUDA在未来计算技术发展中的潜力与方向。
|
小程序 Java 程序员
【规范】Apifox就应该这么玩
本文作者通过对比Postman与Apifox,分享了在项目中使用Apifox进行接口文档整理的方法,旨在帮助读者提升工作效率。文章详细介绍了Apifox目录整理策略、环境管理技巧及前置/后置操作的应用,使接口管理更加有序高效。无论是在短期开发还是长期迭代项目中,这些方法都能帮助开发者更好地管理和维护接口文档。
334 0
【规范】Apifox就应该这么玩
|
设计模式 Java 测试技术
【Selenium使用误区】Iframe元素定位失败:避免误提GitHub Issue的技巧
本文分享了作者在使用Selenium进行UI自动化测试时遇到的一个常见问题:在模拟登录163邮箱的过程中,元素定位失败,原因是没有正确地定位到iframe内的元素。文章通过分析问题原因、提供解决方案和附录代码,指导读者如何避免类似的错误,并强调了在UI自动化测试中准确定位页面元素的重要性。
394 1
|
弹性计算 安全 数据安全/隐私保护
阿里云ECS服务器被植入挖矿木马解决过程分享
阿里云ECS服务器是目前很多网站我们在使用的,但是如果安全做的不够好,有时候就会被植入木马,例如我们有时候会收到阿里云的短信提醒,提醒服务器存在挖矿进程,请立即处理的安全告警。 出现这种情况往往网站都无法正常的打开,卡的连服务器SSH远程连接都进不去,给我们造成了很大的影响。
11916 0

热门文章

最新文章