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

news2024/11/22 22:01:56

Go语言中的控制结构详解

在这里插入图片描述

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

1. 条件语句

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

if 和 else 的使用

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

package main

import "fmt"

func main() {
    x := 10

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

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

package main

import "fmt"

func main() {
    score := 85

    if 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 main

import "fmt"

func main() {
    count := 1

    for count <= 5 {
        fmt.Println(count)
        count++
    }
}
无限循环

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

package main

import "fmt"

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

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

range 遍历

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

package main

import "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 main

import "fmt"

func main() {
    day := 3

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

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

package main

import "fmt"

func main() {
    number := 8

    switch {
    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 main

import "fmt"

func main() {
    fmt.Println("开始")

    defer fmt.Println("结束")  // 延迟执行

    fmt.Println("处理中...")
}

输出:

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

5. 错误处理机制:panicrecover

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

panic

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

package main

import "fmt"

func main() {
    fmt.Println("开始")

    panic("程序遇到严重错误")

    fmt.Println("这行不会被执行")
}

输出:

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

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

package main

import "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.coloradmin.cn/o/2209691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十四章 RabbitMQ延迟消息之延迟队列

目录 一、引言 二、死信队列 三、核心代码实现 四、运行效果 五、总结 一、引言 什么是延迟消息&#xff1f; 发送者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间后收到消息。 什么是延迟任务&#xff1f; 设置在一定时间之后才…

InfluxDB持久层封装

InfluxDB持久层封装 了解如何使用spring-boot来操作InfluxDB数据库&#xff0c;首先我们来看下整个的系统结构图例&#xff1a; 对比下mybatis中的执行流程&#xff1a; 1_自动装配 首先&#xff0c;我们来看下第一步自动装配&#xff1a;依赖spring-boot自动装配出InfluxDB对…

第十五届蓝桥杯C/C++学B组(解)

1.握手问题 解题思路一 数学方法 50个人互相握手 &#xff08;491&#xff09;*49/2 &#xff0c;减去7个人没有互相握手&#xff08;61&#xff09;*6/2 答案&#xff1a;1024 解题思路二 package 十五届;public class Min {public static void main(String[] args) {i…

实时从TDengine数据库采集数据到Kafka Topic

实时从TDengine数据库采集数据到Kafka Topic 一、认识TDengine二、TDengine Kafka Connector三、什么是 Kafka Connect&#xff1f;四、前置条件五、安装 TDengine Connector 插件六、启动 Kafka七、验证 kafka Connect 是否启动成功八、TDengine Source Connector 的使用九、添…

【更新】A股上市公司企业网络安全治理数据集(2007-2023年)

一、测算方式&#xff1a;参考C刊《金融评论》王辉&#xff08;2024&#xff09;老师的做法&#xff0c;安全治理种子词的选取主要依托于《中华人民共和国网络安全法》、《中华人民共和国数据安全法》、《关键信息基础设施安全保护条例》等法律法规文件与《网络安全审查办法》、…

蓝桥杯刷题--幸运数字

幸运数字 题目: 解析: 我们由题目可以知道,某个进制的哈沙德数就是该数和各个位的和取整为0.然后一个幸运数字就是满足所有进制的哈沙德数之和.然后具体就是分为以下几个步骤 1. 我们先写一个方法,里面主要是用来判断,这个数在该进制下是否是哈沙德数 2. 我们在main方法里面调用…

量化之一:均值回归策略

文章目录 均值回归策略理论基础数学公式 关键指标简单移动平均线&#xff08;SMA&#xff09;标准差Z-Score 交易信号实际应用优缺点分析优点缺点 结论 实践backtrader参数&#xff1a;正常情况&#xff1a;异常情况&#xff1a; 均值回归策略 均值回归&#xff08;Mean Rever…

华为公有云实战

1.申请一台ECS云主机&#xff0c;并且可以提供web服务 1.1访问云主机-华为特有技术novnc&#xff0c;KVM中提到vnc技术&#xff0c;novnc是不用安装vnc客户端用浏览器html语言实现。 1.2cloudshell 1.3小工具 ssh 弹性ip 1.4.安装httpd服务 建立索引文件 浏览器上输入弹性ip可…

网络资源模板--Android Studio 实现简易记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易记事本App 二、项目测试环境 三、项目详情 首页 创建一个空的笔记本列表 mNotebookList。使用该列表和指定的布局资源 item_notebook 创建…

前端开发笔记--html 黑马程序员1

文章目录 前端开发工具--VsCode前端开发基础语法VsCode优秀插件Chinese --中文插件Auto Rename Tag --自动重命名插件open in browserOpen in Default BrowserOpen in Other Browser Live Server -- 实时预览 前端开发工具–VsCode 轻量级与快速启动 快速加载&#xff1a;VSCo…

WordPress添加meta标签做seo优化

一、使用function.php文件添加钩子函数添加 方法1、使用is_page()判断不同页面的page_id进行辨别添加不同页面keyword和description &#xff08;1&#xff09;通过页面前台源码查看对应页面的id &#xff08;2&#xff09;或者通过wordpress后台&#xff0c;点击页面列表&…

云计算ftp 服务器实验

创建VLAN 10 划分端口 创建VLAN 10 的地址 10.1.1.1 服务器的地址是 10.1.1.2 这是服务上的配置 服务器上选择ftp 启动 &#xff0c;文件目录选择一下 在 交换机上 ftp 10.1.1.2 服务器的地址 把刚才创建的shenyq txt 文件下载下到本地交换机 我们能看到交换…

有关安科瑞Acrel-1000DP分布式光伏监控系统在某公司分布式光伏发电项目中的应用探讨-安科瑞 蒋静

摘要&#xff1a;分布式光伏作为可再生能源的一种重要形式&#xff0c;能够根据不同场地的实际情况进行定制&#xff0c;尽可能地利用可用空间&#xff0c;减少对传统化石燃料的依赖&#xff0c;也能降低温室气体排放、改善环境质量。在政策支持和市场需求的双重推动下&#xf…

电脑查不到IP地址是什么原因?怎么解决

在日常使用电脑的过程中&#xff0c;有时会遇到无法查询到电脑IP地址的情况&#xff0c;这可能会影响到网络的正常使用。本文将探讨电脑查不到IP地址的可能原因&#xff0c;并提供相应的解决方案。 一、原因分析 ‌网络连接问题‌&#xff1a;首先&#xff0c;网络连接不稳定或…

MySQL(B站CodeWithMosh)——2024.10.11(14)

ZZZZZZ目的ZZZZZZ代码ZZZZZZ重点ZZZZZZ操作&#xff08;非代码&#xff0c;需要自己手动&#xff09; 8- CASE运算符The CASE Operator_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p62&vd_sourceeaeec77dfceb13d96cce76cc299fdd08 在sql_store中&am…

智能网联汽车安全隐患,如何化解?

0. 智能网联汽车安全问题如何才能解决&#xff1f;1. TARA 威胁分析与风险评估平台2. CSTP 智能网联汽车网络安全测试平台3. 智能网联汽车安全解决方案4. 车联网测试认证与培训解决方案5. 车联网网络安全实验室建设方案 0. 智能网联汽车安全问题如何才能解决&#xff1f; 智能…

FFmpeg的简单使用【Windows】--- 简单的视频混合拼接

实现功能 点击【选择文件】按钮在弹出的对话框中选择多个视频&#xff0c;这些视频就是一会将要混剪的视频素材&#xff0c;点击【开始处理】按钮之后就会开始对视频进行处理&#xff0c;处理完毕之后会将处理后的文件路径返回&#xff0c;并在页面展示处理后的视频。 视频所…

【数据结构】排序算法系列——桶排序(附源码+图解)

桶排序 算法思想 桶排序&#xff08;BucketSort)&#xff0c;也被叫做箱排序&#xff0c;它将整个数据组分为n个相同大小的子区间&#xff0c;这类子区间或称为桶。输入数据是均匀、独立分布的&#xff0c;所以一般不会出现一个桶中装有过多数据的情况。作为一种排序算法&…

160页PPT | 埃森哲-制造业变革转型八大领域:痛点剖析与改进策略

PT下载链接见文末~ 引言&#xff1a;制造业数字化转型规划 制造业正处于数字化转型的关键时期&#xff0c;旨在通过技术革新和流程优化&#xff0c;灵活应对市场波动&#xff0c;强化竞争优势&#xff0c;并紧跟技术进步的步伐。此规划围绕三大核心要素展开&#xff1a; 1、…

Pytest中fixture的scope详解

pytest作为Python技术栈下最主流的测试框架&#xff0c;功能极为强大和灵活。其中Fixture夹具是它的核心。而且pytest中对Fixture的作用范围也做了不同区分&#xff0c;能为我们利用fixture带来很好地灵活性。 下面我们就来了解下这里不同scope的作用 fixture的scope定义 首…