Golang - goto语句

news/2024/11/17 13:00:25/文章来源:https://www.cnblogs.com/beatle-go/p/18357389

用途

可以无条件地转移到过程中指定的行。该语句通常与条件语句配合使用,可用来实现条件转移,构成循环,跳出循环体等功能,但在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。

语法

goto label;  
...  
label: statement;

注意:

  • 作用域:只能跳转到同一函数内的标签处,不能跨函数跳转。
  • 避免滥用:尽管在某些情况下可以简化代码,但在结构化程序设计中一般不主张使用,因为它可能导致程序流程混乱,增加理解和调试的难度。
  • 跳转限制:该语句与标签之间不能插入变量声明,否则会导致编译错误。

优点

  • 简化复杂控制流:在某些情况下,特别是当需要从深层嵌套的循环或条件语句中快速跳出时,可以提供一种简洁的方式来控制程序的流程。这可以避免编写大量的布尔变量或额外的循环控制逻辑。

  • 提高代码可读性(在某些情况下):虽然这听起来有些矛盾,但在某些特定的、复杂的控制流场景中,可以使代码的逻辑更加直观。然而,这通常取决于具体的使用情况和编程者的能力。

  • 历史遗留代码:在一些老旧的或历史遗留的代码中,可能已经被广泛使用。在这种情况下,继续使用可能是为了保持代码的一致性和减少修改量。

缺点

  • 降低代码可读性:该语句可以轻易地破坏代码的结构和逻辑流,使得其他开发者(或未来的你)难以理解代码的意图。它可能导致所谓的“意大利面条代码”,即代码的流程像一盘乱糟糟的意大利面条一样难以追踪。

  • 增加维护难度:使用该语句的代码更难以维护和修改。因为该语句可以跳转到程序中的任何位置,所以修改一个该语句或它所指向的标签可能会影响到整个程序的逻辑。

  • 鼓励不良编程习惯:过度依赖该语句可能会鼓励开发者编写难以理解和维护的代码。它可能会掩盖更清晰的编程结构(如循环、条件语句、函数等)的使用。

  • 限制代码重用:由于该语句的特定性和局限性,它可能会限制代码的重用性。使用更通用的控制流结构(如函数和循环)可以使代码更易于重用和模块化。

  • 现代编程语言的替代方案:许多现代编程语言提供了更强大、更灵活的控制流结构(如异常处理、协程、闭包等),这些结构通常可以替代该语句的使用,同时提供更好的代码可读性和可维护性。

package mainimport "fmt"func main() {n := 22maxReTries := 3fmt.Println("test0")
label:fmt.Println("test1")if n > 20 && maxReTries > 0 {maxReTries--goto label}fmt.Println("test2")
}

总结

goto在 Go 中的使用应该是有限且谨慎的,通常只用于解决特定的、复杂的控制流问题。在大多数情况下,应该优先考虑其他更清晰的编程结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783447.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 42 动态规划 Part09

188. 买卖股票的最佳时机 IV 做完上一道题后再看就简单许多了。股票问题的重点就在于两点:找到所有的状态 状态如何转移对于本题,一共包含2*k种状态(第1,2...k次持有,第1,2...k次卖出)。状态间如何转移呢?见下图class Solution {public int maxProfit(int k, int[] pri…

【Python使用】嘿马python基础入门全体系教程第1篇:目标,计算机组成【附代码文档】

本教程的知识点为:计算机组成 什么是计算机? 计算机是由什么组成的? 1. 硬件系统: 2. 软件系统: 目标 运算符的分类 1. 算数运算符 2. 赋值运算符 3. 复合赋值运算符 判断语句和循环语句 if嵌套 1. if嵌套的格式 2. if嵌套的应用 if嵌套执行流程 容器:字符串、列表、元组…

Avnet ZUBoard 1CG开发板上手—深度学习新选择

本文主要介绍了Avnet ZUBoard 1CG开发板的特性、架构、硬件单元等概念,并对如何使用以太网接口和串口连接开发板进行基本介绍,同时辅以两个应用例程演示其功能。Avnet ZUBoard 1CG 开发板上手—深度学习新选择 摘要 本文主要介绍了 Avnet ZUBoard 1CG 开发板的特性、架构、硬…

5-用PyTorch实现线性回归

下面是损失函数下面是优化器 下面通过model.parameters()可以获得model中所有的参数点击查看代码 import torch from torch import devicex_data = torch.tensor([[1.0], [2.0], [3.0]]) y_data = torch.tensor([[2.0], [4.0], [6.0]])class LinearModel(torch.nn.Module):def …

一文搞懂应用架构的3个核心概念

如果你是一名业务开发,你可能要说,我整天就是做CRUD(增删改查),哪里需要了解什么应用架构设计? 经常有人说,程序员 35 岁之后很容易陷入瓶颈,被行业淘汰,我觉得原因其实就在此。 有些朋友在写代码的时候,可能没有太多考虑非功能性的需求、扩展性,只是完成功能,觉得…

Openwrt 配置 PS5 端口转发

ps5 端口转发前言前阵子申请了公网IP通过了想远程串流玩PS5 通过Socat配置端口转发后仅桌面端Chiaki可以远程串流PS5 改用Openwrt的防火墙转发使PSPlay+Chiaki都可串流环境Openwrt 22.03.6 状态 > 概览 > 固件版本步骤打开 网络 > 防火墙 > 端口转发 点击 添加 配置…

vue绑定属性的指令

前面学习的插值表达式{{}},并不能更改标签的属性。因此,以下的写法是错误的,<h1 titlle="{{title}}" >我是h1标签的内容</h1>如果想要给标签的属性绑定动态值,需要借助v-bind 的指令语法:v-bind:原生HTML标签的属性="data中定义的值",可以…

P5535 【XR-3】小道消息

先介绍伯特兰切比雪夫定理:伯特兰—切比雪夫定理说明:若整数n>3,则至少存在一个质数p,符合n<p<2n − 2。另一个稍弱说法是:对于所有大于1的整数n,至少存在一个质数p,符合n<p<2n。 知道这个之后这道题就很简单了,我们先简单想想一个质数在一天可以通知除去它的倍数…

CMake 构建 C++ 项目

使用 CMake 构建C++项目便于跨平台开发,在Linux上可以生成 makefile ,并通过 make来进行编译。在Windows上可以生成 .sln 项目,并结合VS继续进行开发,或 MSVC 编译器来直接将项目编译成目标文件。 1、 创建 .cpp 文件,以编译成exe程序 #include <iostream>int main(…

【专题】2024无人驾驶网约车乘坐意愿调查报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37335科技迅猛发展,无人驾驶技术从科幻走进现实,2024 年无人驾驶网约车成热议话题。 阅读原文,获取专题报告合集全文,解锁文末208份无人驾驶网约车相关行业研究报告。 报告表明,近 60%受访者期待,00 后更积极,80 后较谨慎。性别上男性更…

.NET周刊【8月第1期 2024-08-04】

国内文章 EF Core性能优化技巧 https://www.cnblogs.com/baibaomen-org/p/18338447 这篇文章介绍了在代码层面上优化EF Core实例池和拆分查询的方法。首先,文章建议使用DbContext实例池来重复利用实例,避免资源浪费,并提供相关使用示例。其次,文章讨论了笛尔卡乘积对复杂查…

【视频讲解】滚动回归Rolling Regression、ARIMAX时间序列预测Python、R实现应用

原文链接: https://tecdat.cn/?p=37338 原文出处:拓端数据部落公众号 分析师:Jixin Zhong 本文将通过视频讲解,展示如何用滚动回归预测,并结合一个R语言多元时间序列滚动预测:ARIMA、回归、ARIMAX模型分析实例的代码数据,为读者提供一套完整的实践数据分析流程。 滚动回…