一文熟悉 Go 的分支结构(if - else-if - else、switch)

news2025/3/1 1:40:15

哈喽大家好,我是陈明勇,今天分享的知识是 Go 的分支结构。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

耐心和持久胜过激烈和狂热。

分支结构

分支结构是结构化程序设计中的基础。针对分支结构,Go 提供了两种语句形式,一种是 if,另一种是 switch

if

if 语句是 Go 中最常用、最简单的分支控制结构,它分为单分支、双分支以及多分支三种用法。if 语句会根据布尔变量或布尔表达式,在两个或多个分支中选择一个执行。以下为 if 语句的形式:

if bool_condition {
	// 新分支
}
// 原分支

如果布尔变量或布尔表达式为 true ,则进入新分支执行,否则会继续按照原分支的代码去执行。

单分支 if

在这里插入图片描述
单分支的用法,如果布尔表达式成立,则执行新分支的代码,然后继续执行原分支的代码,否则执行原分支的代码,下面是代码示例:

import "fmt"

func main() {
	num := 3
	if num > 2 {
		fmt.Println("num 大于 2")
	}
	fmt.Println("原分支代码")
}

打印结果

num 大于 2
原分支代码

因为 num > 2 因此,程序运行之后,会执行新分支的打印语句以及原分支的打印语句。除了单个布尔表达式以外,还可以加入 &&|| 条件运算符进行条件的组合,例如:

import "fmt"

func main() {
	num := 3
	if num > 2 && num < 10 {
		fmt.Println("num 大于 2 并且 num 小于 10")
	}
	fmt.Println("原分支代码")
}

双分支 if-else

在这里插入图片描述
双分支结构,if 配合 else 关键字实现。如果表达式为 true,执行 分支1,否则执行 分支2,然后继续执行 原分支。下面是代码示例:

import "fmt"

func main() {
	age := 18
	if age == 18 {
		fmt.Println("您已满18岁")
	} else {
		fmt.Println("您未满18岁")
	}
	fmt.Println("原分支代码")
}

执行结果:

您已满18岁
原分支代码

age 的值为 18,因此会执行第一个分支的里打印语句,然后继续执行原分支的打印语句。

多分支 if - else if - else

在这里插入图片描述
多分支需要在 ifelse 的形式上,加上 else if 进行实现。如果 if 后面的布尔表达式不成立,则会判断 else if 后面的布尔表达式,然后进行分支的选择,下面是代码示例:

import "fmt"

func main() {
	name := "小明"
	if name == "小红" {
		fmt.Println("您好,小红!")
	} else if name == "小明" {
		fmt.Println("您好,小明!")
	} else {
		fmt.Println("您好,陌生人!")
	}
	fmt.Println("原分支代码")
}

执行结果:

您好,小明!
原分支代码

程序根据布尔表达式条件的值,选择了第二个分支去执行代码。

在 if 语句中声明变量

if 语句中,布尔表达式之前声明变量是 Go 语言的惯用法,这种使用方式可以提高代码的可读性。由于是在 if 语句中声明的变量,因此变量的作用域也只在 if 语句中,外部无法访问这些变量。下面是示例:

import "fmt"

func main() {
	mp := map[string]string{"name": "cmy"}

	if name, ok := mp["name"]; ok {
		fmt.Printf("存在 key → name:%s\n", name)
	} else {
		fmt.Println("key 不存在")
	}
	fmt.Println("原分支代码")
}

if 语句中定义 name,ok 变量,使用 ok 判断 key 是否存在,如果存在则执行分支里的代码。

switch

基本用法:

switch T {
case value1:
	// 分支 1
case value2, value3, ...:
	// 分支 2
...
default:
	// 默认分支
}

T 可以是常量、变量和布尔表达式等,case 关键字后面的 value 类型,必须与 T 的类型是一致的,且 value 是唯一的。Go 会根据 T 的值与各个 case 后面的 value 进行匹配,匹配成功则执行对应 case 分支,case 后面可以有多个 value。default 为默认分支,可有可无,如果前面的 case 都没匹配上,则会执行 default 分支。

示例

import "fmt"

func main() {
	name := "小明"
	if name == "小红" {
		fmt.Println("您好,小红!")
	} else if name == "小明" {
		fmt.Println("您好,小明!")
	} else {
		fmt.Println("您好,陌生人!")
	}
	fmt.Println("原分支代码")
}

上面的代码,可以使用 switch 分支改造:

import "fmt"

func main() {
	name := "小明"
	switch name {
	case "小明":
		fmt.Println("您好,小明!")
	case "小红":
		fmt.Println("您好,小红!")
	default:
		fmt.Println("您好,陌生人!")

	}
	fmt.Println("原分支代码")
}

执行结果:

您好,小明!
原分支代码

name 等于 小明,与第一个 case 分支匹配成功,执行这个分支的代码,然后继续执行原分支的代码。

switch 分支当 if 分支使用

switch 分支后面不带常量、变量或布尔表达式等时,其效果与 if 分支类似。

import "fmt"

func main() {
	switch {
	case 1+1 != 2:
		fmt.Println("1 + 1 不等于 2")
	case 1+1 == 2:
		fmt.Println("1 + 1 等于 2")
	default:
		fmt.Println("0")

	}
	fmt.Println("原分支代码")
}

switch 后面什么都没有时,程序会根据 case 后面布尔表达式的值进行分支的选择。

在 switch 语句中声明变量

if 一样,我们也可以在 switch 语句中声明变量,变量的作用域也只在 swtich 语句中,外部无法访问这些变量。

import "fmt"

func main() {
	mp := map[string]string{"name": "cmy"}
	switch name := mp["name"]; name {
	case "cmy":
		fmt.Println("cmy")
	case "kk":
		fmt.Println("kk")
	default:
		fmt.Println("unknown")

	}
	fmt.Println("原分支代码")
}

fallthrough

Go 语言中,不同于其他语言,switch 块内,每个 case 无需声明 break 来终止。如果我们想执行多个 case 分支,可以使用 fallthrough 关键字来实现。

import "fmt"

func main() {
	mp := map[string]string{"name": "cmy"}
	switch name := mp["name"]; name {
	case "cmy":
		fmt.Println("cmy")
		fallthrough
	case "kk":
		fmt.Println("kk")
	default:
		fmt.Println("unknown")

	}
	fmt.Println("原分支代码")
}

执行结果:

cmy
kk
原分支代码

在第一个 case 分支后面使用了 fallthrough,不论下一个 case 是否与 cmy 匹配,都会执行这个分支的代码。

小结

本文对两种分支结构(ifswitch)进行了介绍,也举例说明了一些特殊的用法。如果代码存在着复杂的 if 多分支结构,不妨用 swtich 进行改造,也许代码的可读性会更高。

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

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

相关文章

Python爬虫脚本+XML解析实现自动保存某商城的商品图

文章目录 1.背景介绍2.代码分析2.1.创建图片保存的目录2.2.定一下载函数2.3.发送请求解析数据2.源代码(全)1.背景介绍 Python脚本可以实现数据的爬取,而XML可以解析网页数据。将Python爬虫脚本与XML解析功能相结合,可以实现自动保存某商城的商品图功能。 注:本功能仅用于…

基于AlexNet卷积神经网络的手写体数字识别系统研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、手写体数字识别系统✳️ 2.1 MNIST 数据集✳️ 2.2 CNN✳️ 2.3 网络训练✳️ 三、手写体数字识别结果✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 手写数字识别是计算机视觉领域中的一个重要应用&#xff0c;已广泛应用在很…

电动汽车充电站的最优选址matlab程序

​摘要&#xff1a;以规划期内充电站的总成本 &#xff08;包括投资、运行和维护成本&#xff09;和网损费用之和最小为目标&#xff0c;考虑了相关的约束条件&#xff0c;构造了电动汽车充电站最优规划的数学模型&#xff0c; 关键词&#xff1a;电动汽车&#xff1b;充电站&a…

角色扮演?一款跨平台可移植开源游戏

程序员宝藏库&#xff1a;gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容&#xff0c;包括开源项目、资源工具、技术文章等方面。 每周五定期发布&#xff0c;同步更新到 知乎&#xff1a;Jackpop 。 欢迎大家投稿&#xff0c;提交issue&#…

支付系统设计概览

前言 就个人对支付的一些理解和经验&#xff0c;在此编辑出来和大家一起交流分享。请大佬多多指正。 在各种互联网场景中&#xff0c;牵扯到交易的情况&#xff0c;大多都需要支付系统的支持。支付系统往往不是一蹴而就的&#xff0c;往往都是随着业务的不断扩展&#xff0c;…

【python】面向对象程序设计(基础篇)

个人主页&#xff1a;天寒雨落的博客_CSDN博客-初学者入门C语言,python,数据库领域博主 &#x1f4ac; 热门专栏&#xff1a;python_天寒雨落的博客-CSDN博客 ​每日赠语&#xff1a;没有窘迫的失败&#xff0c;就不会有自豪的成功&#xff1b;失败不可怕&#xff0c;只要能从失…

浅识vue的虚拟DOM和渲染器

虚拟DOM本质上是对DOM的抽象描述&#xff0c;就是一个普通的js对象。他身上的属性要比真实DOM的属性要少得多。 在一定情况下&#xff0c;使用虚拟DOM的性能要逊于直接使用真实DOM。 例如&#xff0c;在页面一开始的时候&#xff0c;Vue需要先通过生成虚拟DOM树&#xff0c;在…

【雷达通信】雷达探测项目仿真附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

《恋上数据结构与算法》第1季:链表原理实现(图文并茂)

数据结构与算法的学习笔记目录&#xff1a;《恋上数据结构与算法》的学习笔记 目录索引链表原理实现一、链表二、链表的设计三、链表的接口设计四、链表接口的实现1. 索引越界的判断2. 根据索引查找指定节点3. 添加数据4. 插入元素5. 删除元素6. 清空元素7. 修改元素8. 查找元素…

傻白入门芯片设计,RDL/Interposer/EMIB/TSV(三)

目录 一、再分配层&#xff08;RDL&#xff09; 二、硅中介层&#xff08;Si Interposer&#xff09;&#xff1a;Active and Passive 三、嵌入式硅桥&#xff08;EMIB&#xff09; 四、硅通孔 TSV&#xff08;Through Silicon Vias&#xff09; 一、再分配层&#xff08;R…

CCF CSP认证2022年6月 归一化处理、寻宝!大冒险!、光线追踪

这是我第一次参加了这次CSP考试&#xff0c;300分&#xff0c;写了124三题&#xff0c;模拟题到现在都没看过题面没看&#xff0c;笑&#xff0c;t4写成模拟加数据结构&#xff0c;200行&#xff0c;因为一个小错误调了1h&#xff0c;错失了大好机会。考试环境的VSC配置的字体太…

[一篇读懂]C语言十讲:单链表的新建、查找

[一篇读懂]C语言十讲&#xff1a;单链表的新建、查找1. 与408关联解析及本节内容介绍1 与408关联解析2 本节内容介绍2. 头插法新建链表实战3. 尾插法新建链表实战4. 按位置查找及按值查找实战5. 往第i个位置插入元素实战6. 链表的调试方法总结234561. 与408关联解析及本节内容介…

面对无法投入模型训练的object类型数据在头疼,快来使用我的丝滑小连招

面对无法投入模型训练的object类型数据在头疼&#xff0c;快来使用我的丝滑小连招 前言 丝滑小连招 tip1- get_dummies完美one-hot&#xff08;str->int&#xff09; tip2 - rename_dims解决重名问题&#xff01; tip3 - insert且drop&#xff01;​​​​​​​ 前言 我…

小爱同学控制美的美居中的家电热水器,空调等

背景 家里大多数家电都是支持接入米家App的&#xff0c;美的家电不能接入小米&#xff0c;电脑安装Home Assistant成功实现小爱语音控制美的燃气热水器。 实现步骤&#xff1a; 1. 安装docker 我的电脑是windows的&#xff0c;那就直接安装docker desktop https://desktop.…

【Linux】基础指令(三) —— 收尾篇

文章目录前言zip 和 unzip 指令tar 指令bc 指令uname 指令history关机热键补充ctrl c↑ && ↓ctrl rctrl d指令拓展结语前言 今天为大家带来的是最后一部分基础指令讲解。主要内容为 7个指令讲解、热键补充、简单提一下指令的拓展 。内容相对之前较少&#xff0c;更…

服务器密码以及用户名怎么修改

服务器密码以及用户名怎么修改 我是艾西&#xff0c;今天给大家说下服务器密码如何修改 windows2003系统&#xff1a; 1、右键我的电脑&#xff0c;点击“管理”&#xff1a; 2、在“本地用户和组”中打开“用户”&#xff0c;在右侧找到 Administrator 账户进行修改。 200…

【linux】linux实操篇之任务调度

目录前言crond 任务调度概述基本语法快速入门案例案例一&#xff1a;每隔一分钟将ls -l /etc/ 追加到 /tmp/to.txt 文件案例二&#xff1a;每隔一分钟执行python文件结语前言 我们常用linux做一些定时任务&#xff0c;最常见的就是在服务器领域&#xff0c;我们常常做一些定时…

高分辨率格式理论

一个核心概念&#xff1a;人工粘性 考虑经典的双曲守恒律方程 ∂u∂t∂f∂x0{{\partial u} \over {\partial t}} {{\partial f} \over {\partial x}} 0∂t∂u​∂x∂f​0 可以写成守恒形式的数值格式 uin1uin−λ(f^i1/2n−f^i1/2n)u_i^{n 1} u_i^n - \lambda \left( {\ha…

基于ssm+mysql+jsp学生成绩管理系统(含实训报告)

基于ssmmysqljsp学生成绩管理系统(实训报告&#xff09;一、系统介绍二、功能展示1.学生信息查询2.学生信息添加3.学生信息修改4.学生信息删除四、获取源码一、系统介绍 系统主要功能&#xff1a;系统实现了学生信息查询、添加、修改、删除。 环境配置&#xff1a; Jdk1.8 M…

[附源码]java毕业设计智慧教学平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…