Go语言中的控制结构(四)

Go语言中的控制结构详解

在这里插入图片描述

控制结构是编程语言中控制代码执行流程的核心部分,Go语言通过ifforswitch等常见的控制结构,以及独有的deferpanicrecover机制,提供了强大且简洁的控制流管理。本文将详细讲解Go语言中的控制结构,包括条件判断、循环结构、多分支选择、延迟执行及错误处理机制。

1. 条件语句

Go语言的条件语句与其他编程语言类似,通过 ifelseelse if 来实现条件判断。

if 和 else 的使用

Go的 if 语句不需要用圆括号包围条件表达式,同时支持在条件判断之前执行初始化语句。

package mainimport "fmt"func main() {x := 10if x > 5 {fmt.Println("x 大于 5")} else {fmt.Println("x 小于或等于 5")}
}
  • 条件表达式中的布尔值决定了代码块的执行。
  • else 语句是可选的,且必须紧跟 if 语句的结束大括号。
多条件判断(else if)

对于多个条件判断,Go使用 else if 语句来处理。通过 else if,我们可以依次判断多个条件。

package mainimport "fmt"func main() {score := 85if score >= 90 {fmt.Println("优秀")} else if score >= 75 {fmt.Println("良好")} else if score >= 60 {fmt.Println("及格")} else {fmt.Println("不及格")}
}
  • else if 会依次检查条件,一旦某个条件为 true,对应的代码块会被执行,其后的条件将不再被检查。

2. 循环结构

Go的唯一循环结构是 for,它支持多种形式的使用方式:条件型循环、无限循环和基于范围的循环(range)。

条件型 for 循环

条件型循环与其他语言中的 while 循环类似,只要条件为 true,循环体就会被执行。

package mainimport "fmt"func main() {count := 1for count <= 5 {fmt.Println(count)count++}
}
无限循环

如果没有提供循环的条件表达式,for 会形成一个无限循环。

package mainimport "fmt"func main() {for {fmt.Println("无限循环")}
}

这种循环可以通过 break 语句跳出,或通过 return 提前结束。

range 遍历

Go支持通过 range 关键字遍历数组、切片、映射(map)和通道(channel)等集合。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}for index, value := range numbers {fmt.Printf("索引: %d, 值: %d\n", index, value)}
}
  • range 会返回每个元素的索引和值。
  • 你可以通过 _ 忽略不需要的返回值,比如只关心值而不关心索引。

3. switch 语句

Go的 switch 语句提供了一种多分支选择的方式,它不仅支持常规的值匹配,还支持表达式匹配。

多分支选择

switch 语句可以代替多层 if-else 判断,语法更为简洁。

package mainimport "fmt"func main() {day := 3switch day {case 1:fmt.Println("星期一")case 2:fmt.Println("星期二")case 3:fmt.Println("星期三")default:fmt.Println("其他")}
}
  • switch 默认只执行匹配的 case,并自动退出。
  • default 用于没有匹配到任何 case 时执行。
匹配表达式

Go的 switch 还支持更复杂的表达式匹配,而不仅限于常量比较。

package mainimport "fmt"func main() {number := 8switch {case number < 5:fmt.Println("小于 5")case number >= 5 && number <= 10:fmt.Println("在 5 到 10 之间")default:fmt.Println("大于 10")}
}
  • 这种模式类似于 else if,能够检查条件表达式,而不是具体值。
  • switch 语句也支持多个 case 值的组合。

4. 延迟执行的 defer

defer 语句用于延迟执行某个函数或语句,直到其外层函数返回时才会执行。常用于资源清理、文件关闭、锁的释放等场景。

package mainimport "fmt"func main() {fmt.Println("开始")defer fmt.Println("结束")  // 延迟执行fmt.Println("处理中...")
}

输出:

开始
处理中...
结束
  • defer 会在当前函数退出前执行,多个 defer 会按 后进先出 的顺序执行。

5. 错误处理机制:panicrecover

Go语言采用了一种轻量级的错误处理机制,使用 panic 触发异常,而通过 recover 来捕获并恢复异常。

panic

panic 用于终止程序的执行,并抛出一个错误信息。常用于程序遇到不可恢复的严重错误时。

package mainimport "fmt"func main() {fmt.Println("开始")panic("程序遇到严重错误")fmt.Println("这行不会被执行")
}

输出:

开始
panic: 程序遇到严重错误
  • panic 会立即停止当前函数的执行,并开始逐级向上返回,直到整个程序崩溃。
recover

recover 用于捕获 panic 导致的异常,避免程序崩溃。

package mainimport "fmt"func main() {defer func() {if r := recover(); r != nil {fmt.Println("捕获异常:", r)}}()panic("触发异常")
}

输出:

捕获异常: 触发异常
  • recover 只能在 defer 函数中调用,且必须在 panic 被触发之后才能捕获异常。
  • 如果没有 recoverpanic 将导致程序崩溃。

扩展阅读:

  • Go语言官方文档
  • Effective Go
  • Go by Example - 通过实例学习Go

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

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

相关文章

ASR-01和ESP32语音控制LED灯——基于VSCODE编辑器和ESP-IDF环境

一、ASR-01部分 大家不要问我软件哪里来&#xff0c;大家哪里买的的&#xff0c;就去哪里要&#xff0c;淘宝客服一定有&#xff0c;没有你就换一家。 图形化编程 原理&#xff1a;通过接收相匹配语音&#xff0c;赋值给ID&#xff0c;然后通过switch语句&#xff0c;判断ID值…

Linux内核USB3.0驱动框架分析--USB Hub代码分析

一、Linux 下USB Hub热插拔处理 1.1 Linux下USB HUB的驱动的实现和分析&#xff1a; USB设备是热插拔&#xff0c;因此在hub_probe函数中调用hub_configure函数来配置hub&#xff0c;在这个函数中主要是利用函数usb_alloc_urb函数来分配一个urb&#xff0c;利用usb_fill_int_u…

金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一份 肝完进大厂 妥妥的&#…

【Linux】操作系统基础

1.冯诺依曼体系结构介绍 冯诺依曼体系结构如下&#xff1a; 在上图中「输⼊设备」和「输出设备」⼀般被称为计算机的外设&#xff0c;⽽「存储器」在冯 诺依曼体系结构中表示「内存」 输⼊设备⼀般包括&#xff1a;⽹卡、磁盘、键盘、触摸屏等 输出设备⼀般包括&#xff1a;…

java 自定义填充excel并导出

首先在resources下面放一个excel模板 1. 方法签名和请求映射 RequestMapping(value "/ExportXls") public ResponseEntity<byte[]> rwzcExportXls(HttpServletRequest request, RequestBody JSONArray jsonArray) throws IOException { RequestMapping(val…

剧场的客户端形式区别,APP,小程序,H5的不同优势以及推广方案

剧场的客户端形式区别与推广策略 在数字化时代&#xff0c;剧场的线上化成为大势所趋。不同的线上平台如APP、小程序和H5各有千秋&#xff0c;如何选择最适合自己的平台&#xff0c;并制定有效的推广方案&#xff0c;成为了剧场管理者需要考虑的重要问题。 APP&#xff1a;深度…

【ONE·Web || HTML】

总言 主要内容&#xff1a;HTML基本知识入门&#xff0c;主要介绍了常见的一些标签使用&#xff0c;以及简单案例演示。       文章目录 总言0、前置说明1、认识HTML1.1、是什么1.2、初识 HTML 标签、HTML 文件基本结构1.2.1、相关说明1.2.2、vscode如何快速生成代码 2、HT…

污水排放口细粒度检测数据集,污-水排放口的类型包括10类目标,10000余张图像,yolo格式目标检测,9GB数据量。

污水排放口细粒度检测数据集&#xff0c;污-水排放口的类型包括10类目标&#xff08;1 合流下水道&#xff0c;2 雨水&#xff0c;3 工业废水&#xff0c;4 农业排水&#xff0c;5 牲畜养殖&#xff0c;6 水产养殖&#xff0c;7 地表径流&#xff0c;8 废水处理厂&…

三菱FX3U PLC绝对定位- DRVA指令

指令格式 相关软元件一览 功能和动作 这是采用绝对驱动的单速定位指令。采用从原点(0点)开始的距离指定方式&#xff0c; 也被称为绝对驱动方式。 1、在指令执行过程中&#xff0c;即使改变操作数的内容&#xff0c;也不反映到当前的运行中。 在下次的指令驱动时才有效…

QT 中如何保存matlab 能打开的.mat数据矩阵!

Windows 上安装并使用 MATIO 库来保存 MATLAB 格式的 .mat 文件&#xff0c;需要进行以下步骤&#xff1a; 1. 下载并安装 CMake MATIO 使用 CMake 构建项目&#xff0c;因此你需要先安装 CMake。 前往 CMake 官网下载适用于 Windows 的安装程序并安装。 2. 下载 MATIO 库源…

Windows,MySQL主从复制搭建

前提&#xff1a;windows环境&#xff0c;同一个服务器安装多个相同版本的mysql数据库 多个MySQL服务搭建完成后&#xff0c;下面我们进行主从复制的相关配置 1.主数据库 执行指令 #创建用户 CREATE USER slavelocalhost IDENTIFIED BY 123456;#授权 GRANT REPLICATION SLA…

专线监控的使用方法:运维团队的全面实战指南

在当今高度信息化的时代&#xff0c;专线网络已成为企业连接不同地域、保障业务连续性的重要基础设施。然而&#xff0c;随着网络架构的复杂化和业务需求的多样化&#xff0c;运维团队面临着前所未有的挑战。为了有效应对这些挑战&#xff0c;运维团队需要深入了解并熟练掌握专…

前端埋点学习

前端埋点 前端数据埋点是在前端页面中通过代码的方式手机用户行为数据和页面性能的过程&#xff0c;通过在页面中插入指定的代码&#xff0c;实现实时监控用户在页面上的操作行为。 通常包括一下事件 定义事件: 定义需要手机的数据事件&#xff0c;如点击&#xff0c;浏览等添…

Linux系列-常见的指令(二)

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” mv 剪切文件&#xff0c;目录 重命名 比如说&#xff0c;我们在最开始创建一个新的文件hello.txt 然后我们将这个文件改一个名字&#xff0c;改成world.txt 所以&#xff0c;…

UE5 武器IK瞄准系统

创建空项目 创建基础蓝图类My_GameMode&#xff0c;My_HUD&#xff0c;My_PlayChar&#xff0c;My_PlayController 项目设置地图模式 近裁平面 0.1 My_PlayChar蓝图中添加摄像机&#xff0c;角色骨骼网格体&#xff0c;武器骨骼网格体 编辑角色骨骼&#xff0c;预览控制器使用…

本地生活服务项目入局方案解析!本地生活服务商系统能实现怎样的作业效果?

当前&#xff0c;各大平台的本地生活服务业务日渐兴盛&#xff0c;提高创业者入局意向的同时&#xff0c;也让本地生活服务项目有哪些等问题也成为了多个创业者社群中的热议对象。而从目前的讨论情况来看&#xff0c;在创业者们所询问的众多本地生活服务项目中&#xff0c;通过…

apisix云原生网关

定义 企业级网关通过域名、路由将请求分发到对应的应用上&#xff0c;通常承载数千个服务的流量&#xff0c;对稳定性有较高要求。 CNCF全景图 选型 Kubernetes抽象出两个核心概念&#xff1a;Service&#xff0c;为多个Pod提供统一的访问入口&#xff1b;Ingress&#xff…

DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中?

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 原文链接&#xff1a;DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中? 如何将 (.mdf) 和 (.ldf) 的SQL Server 数据库文件导入到当前数据库中? Step 1.登录到 Sql Server 服…

18770 差值最大

### 思路 为了找到两个数x和y使得x - y的值最大&#xff0c;并且x在y的右侧&#xff0c;我们可以使用以下方法&#xff1a; 1. 从右向左遍历数组&#xff0c;记录当前遍历到的最大值max_right。 2. 对于每个元素a[i]&#xff0c;计算max_right - a[i]&#xff0c;并更新最大差…

《RabbitMQ篇》消息应答和发布确认

消息应答 消息应答机制&#xff1a;消费者接收信息并处理完之后&#xff0c;告诉rabbitmq该信息已经处理&#xff0c;rabbitmq可以把该信息删除了. 消息自动重新入队&#xff1a;如果处理某个消息的消费者异常关闭了&#xff0c;没有发送ACK确认&#xff0c;rabbitmq会将其重…