一文带你熟悉Go语言中的分支结构
作者:陈明勇 发布时间:2024-03-07 19:52:49
分支结构
分支结构是结构化程序设计中的基础。针对分支结构,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
多分支需要在 if
和 else
的形式上,加上 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
匹配,都会执行这个分支的代码。
小结
本文对两种分支结构(if
、switch
)进行了介绍,也举例说明了一些特殊的用法。如果代码存在着复杂的 if
多分支结构,不妨用 swtich
进行改造,也许代码的可读性会更高。
来源:https://juejin.cn/post/7170354551483007006


猜你喜欢
- 在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854;
- Xtrabackup备份恢复原理备份innodb表时,xtrabackup若干个线程拷贝独立表空间的.ibd文件,并不停监视此过程中redo
- 1、django搜索路径使用 import 语句时,Python 所查找的系统目录清单。查看方式:import sysprint
- Pyppeteer简介Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript
- 灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘
- 本文实例讲述了vue实现父子组件之间的通信以及兄弟组件的通信功能。分享给大家供大家参考,具体如下:<!DOCTYPE html>
- 根据“廖雪峰”的教程进行python学习,计划每天抽出1-2个小时的时间进行充电。Python是著名的“龟叔”Guido van Rossu
- 闭包在我们使用返回函数的时候,由于我们在一个函数中需要返回另一个函数,因此,我们在这个函数中就需要重新定义一个函数。而这样,就造成了我们的函
- 在本节中,我们将详细介绍 Python 标准库中的 json 模块。JSON(JavaScript Objec
- python实现银行管理系统,供大家参考,具体内容如下有的地方用的方法的比较复杂,主要是为回顾更多的知识test1用来存类和函数#test1
- .tkintertkinter是Python下面向tk的图形界面接口库,可以方便地进行图形界面设计和交互操作编程。tkinter的优点是简单
- 前言Node 给前端开发带来了很大的改变,促进了前端开发的自动化,我们可以简化开发工作,然后利用各种工具包生成生产环境。如运行sass sr
- 跟朋友最近聊起来数独游戏,突发奇想使用python编写一个自动计算数独解的小程序。数独的规则不再过多阐述,在此描述一下程序的主要思路:(当前
- 对象Javascript 根本上是和对象相关的。数组是对象。函数是对象。对象是对象。那什么是对象呢?对象是名-值对的集合。名是字符串,值可以
- 使用字符串创建矩阵是一个很实用的功能,之前自己尝试了很多次的小功能使用这个方法就能够简单实现。创建长度为16的字符串,是为了方便能够在各种数
- 预测结果转为numpy:logits=model(feature)#如果模型是跑在GPU上result=logits.data.cpu().
- 一、安装第三方库是可能出现如下错误提示:二、解决办法:最好的解决办法可以通过“Pycharm”左下角
- 什么是迭代器能被 next 指针调用,并不断返回下一个值的对象,叫做迭代器。表示为Iterator,迭代器是一个对象类型数据。概念迭代器指的
- 前言昨天把自己的VASP文件处理库进行了打包并上传到PyPI,现在可以直接通过pip和easy_install来安装VASPy啦(同时欢迎使
- 在经典的数据库理论里,本地事务具备四大特征:原子性事务中的所有操作都是以原子的方式执行的,要么全部成功,要么全部失败;一致性事务执行前后,所