Go学习第四章——程序流程控制
Go学习第四章——程序流程控制
- 1 分支结构
- 1.1 单分支
- 1.2 双分支
- 1.3 多分支
- 1.4 switch分支
- 2 循环结构
- 2.1 for循环
- 2.2 while和dowhile的实现
- 2.3 经典案例——打印金字塔
- 2.4 经典案例——打印九九乘法表
- 3 跳转控制语句
- 3.1 break
- 3.2 continue
- 3.3 goto
- 3.4 return
-
流程控制的作用:
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。 -
控制语句的分类:
控制语句分为三类:顺序、选择和循环。
“顺序结构”代表“先执行a,再执行b”的逻辑。
“条件判断结构”代表“如果…,则…”的逻辑。
“循环结构”代表“如果…,则再继续…”的逻辑。
三种流程控制语句就能表示所有的事情!不信,你可以试试拆分你遇到的各种事情。这三种基本逻辑结构是相互支撑的,它们共同构成了算法的基本结构,无论怎样复杂的逻辑结构,都可以通过它们来表达。所以任何一种高级语言都具备上述两种结构。
本章是大家真正进入编程界的“门票”。 -
流程控制的流程:
1 分支结构
1.1 单分支
基本语法
if 条件表达式 {逻辑代码
}
当条件表达式为ture时,就会执行得的代码。
PS:条件表达式左右的()可以不写,也建议不写
PS:if和表达式中间,一定要有空格
PS:在Golang中,{}是必须有的,就算你只写一行代码。
案例讲解
func main() {// 实现功能:如果口罩的库存小于30个,提示:库存不足:/*var count int = 100// 单分支:if count < 30 {fmt.Println("对不起,口罩存量不足")}*///在golang里,if后面可以并列的加入变量的定义:if count := 20; count < 30 {fmt.Println("对不起,口罩存量不足")}
}
输出:
对不起,口罩存量不足
1.2 双分支
基本语法
if 条件表达式 {逻辑代码1
} else {逻辑代码2
}
当条件表达式成立,即执行逻辑代码1,否则执行逻辑代码2。{}也是必须有的。
案例讲解
func main() {var age bytefmt.Println("请问你的年龄多少?")fmt.Scanln(&age)if age < 18 {fmt.Println("你还没有成年!")} else {fmt.Println("你已经成年了!!")}
}
输出:
请问你的年龄多少?
18
你已经成年了!!
1.3 多分支
基本语法
if 条件表达式1 {逻辑代码1
} else if 条件表达式2 {逻辑代码2
}
.......
else {逻辑代码n
}
案例讲解
略。。。。。只是多了几个else,略了。。
1.4 switch分支
基本语法
switch 表达式 {case 值1,值2,.….:语句块1case 值3,值4,...:语句块2....default:语句块
}
ps:case后是一个表达式(即:常量值、变量、一个有返回值的函数都可以)
ps:case后面可以有多个表达式
ps:case后面的表达式如果是常量值,则不能重复
补充:穿透-fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透
案例讲解
func main() {// a,b,c,d,e,f,gvar week bytefmt.Println("请输入一个字符,在a,b,c,d,e,f,g里:")fmt.Scanf("%c", &week)switch week {case 'a':fmt.Println("星期一")case 'b':fmt.Println("星期二")case 'c':fmt.Println("星期三")case 'd':fmt.Println("星期四")case 'e':fmt.Println("星期五")case 'f', 'g':fmt.Println("周末休息日")default:fmt.Println("您的输入有误,请重新输入")}
}
输出:
请输入一个字符,在a,b,c,d,e,f,g里:
f
周末休息日
2 循环结构
2.1 for循环
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化,即执行初始表达式;随后,对布尔表达式进行判定,若判定结果为true,则执行循环体,否则,终止循环;最后在每一次反复的时候,进行某种形式的“步进”,即执行迭代因子。
语法结构:
for 初始表达式; 布尔表达式; 迭代因子 {循环体;
}
- 初始化部分设置循环变量的初值
- 条件判断部分为任意布尔表达式
- 迭代因子控制循环变量的增减
简单使用:
func main() {for a := 1; a <= 10; a++ {fmt.Println("打印", a, "次")}
}
输出:
打印 1 次
打印 2 次
打印 3 次
打印 4 次
打印 5 次
打印 6 次
打印 7 次
打印 8 次
打印 9 次
打印 10 次
注意事项:
-
循环条件是返回一个布尔值的表达式
-
for循环的第二种使用方式
for 循环判断条件 {// 循环执行语句 }
-
for循环的第三种使用方式
for {// 循环执行语句 }
这种方式等价
for ; ; {}
是一个无限循环,通常需要配合break
语句使用。 -
Golang提供for-range的方式,可以方便遍历字符串、数组、切片、字典等(注:数组的遍历,我们放到讲数组的时候再讲解),案例说明如何遍历字符串。
func main() {// 字符串遍历方式1-传统方式var str string = "hello,world!"for i := 0; i < len(str); i++ {fmt.Printf("i的值为:%d ,str[i]的值为:%c \n", i, str[i])}fmt.Println()// 字符串遍历方式2-for-rangestr = "abc~ok!"for index, val := range str {fmt.Printf("index=%d, val=%c \n", index, val)} }
**注意:**在使用 for-range 遍历字符串时,返回的 val 类型为 rune 类型,而不是 byte 类型。因为字符串在 Go 语言中是采用 UTF-8 编码,每个 rune 类型表示一个 Unicode 码点,可以正确地表示任何 Unicode 字符。因此,在处理和打印中文字符时,一定要注意字符编码的正确性。
2.2 while和dowhile的实现
while的实现:
for {if 循环条件表达式 {break // 跳出for循环..}循环操作(语句)循环变量迭代
}// 例子
func main() {var i int = 1for {if i > 10 {break // 跳出for循环..}fmt.Println("hello world") // 循环操作(语句)i++ // 循环变量迭代}
}
do while的实现
for {循环操作(语句)循环变量迭代if 循环条件表达式 {break // 跳出for循环..}
}// 例子
func main() {var i int = 1for {fmt.Println("hello world")i++if i > 0 { // 故意的break // 跳出for循环..}}
}
// 输出:hello world
2.3 经典案例——打印金字塔
func main() {var n intfmt.Println("请输入你想要显示的金字塔层数:")fmt.Scanf("%d", &n)for i := 1; i <= n; i++ {// 打印空格for j := 1; j <= n-i; j++ {fmt.Print(" ")}// 打印星号for k := 1; k <= 2*i-1; k++ {fmt.Print("*")}fmt.Println() // 换行}
}
输出:
请输入你想要显示的金字塔层数:
5* *** ***** *******
*********
2.4 经典案例——打印九九乘法表
func main() {for i := 1; i <= 9; i++ {for j := 1; j <= i; j++ {fmt.Printf("%d*%d=%-2d ", j, i, i*j)}fmt.Println()}
}
输出:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
3 跳转控制语句
3.1 break
break在循环中的作用:
package main
import "fmt"
func main(){//功能:求1-100的和,当和第一次超过300的时候,停止程序var sum int = 0for i := 1 ; i <= 100 ; i++ {sum += ifmt.Println(sum)if sum >= 300 {//停止正在执行的这个循环:break }}fmt.Println("-----ok")
}
总结:
1.switch分支中,每个case分支后都用break结束当前分支,但是在go语言中break可以省略不写。
2.break可以结束正在执行的循环
深入理解:
package main
import "fmt"
func main(){//双重循环:for i := 1; i <= 5; i++ {for j := 2; j <= 4; j++ {fmt.Printf("i: %v, j: %v \n",i,j)if i == 2 && j == 2 {break}}}
}
总结:break的作用结束离它最近的循环
结果:
i: 1, j: 2
i: 1, j: 3
i: 1, j: 4
i: 2, j: 2
i: 3, j: 2
i: 3, j: 3
i: 3, j: 4
i: 4, j: 2
i: 4, j: 3
i: 4, j: 4
i: 5, j: 2
i: 5, j: 3
i: 5, j: 4
3.2 continue
func main() {for i := 1; i <= 100; i++ {if i%6 != 0 {continue //结束本次循环,继续下一次循环}fmt.Println(i)}
}
结论:continue的作用是结束离它近的那个循环当前循环,开始下一次循环
3.3 goto
- Golang的 goto 语句可以无条件地转移到程序中指定的行。
- goto语句通常与条件语句配合使用。可用来实现条件转移.
- 在Go程序设计中一般不建议使用goto语句,以免造成程序流程的混乱。
- 代码展示:
package mainimport "fmt"func main() {var (input stringcount int)start:fmt.Println("请输入一个合法的字符串:")fmt.Scan(&input)if input == "" {goto start}for i := 0; i < len(input); i++ {if input[i] == 'a' || input[i] == 'A' {count++}}fmt.Printf("字符串 \"%s\" 中包含 %d 个字母 \"a\"。\n", input, count)
}
以上代码实现了一个简单的统计字符串中字母 “a” 出现次数的程序。程序通过使用无限循环和 goto
语句,让用户输入一个字符串,如果输入的字符串为空,则返回 start
标签,继续要求用户输入。
当用户输入一个非空字符串时,程序开始统计其中字母 “a” 的个数,结束后输出结果。在这个过程中,goto
语句用于实现 “输入不为空时跳转到计算代码块” 的功能。这种方式在少数情况下可能比较有用,但要谨慎使用。
需要注意,过多的使用 goto
语句可能会导致程序阅读性和可维护性降低。因此,在实际编写代码时,应该尽可能避免使用 goto
语句,用更加结构化的语言特性来代替。
3.4 return
return
是 Go 语言中的一个关键字,用于结束当前函数或方法的执行,并返回结果(可选)。return
语句可以带有一个或多个返回值。同时,和其他语言不同的是,在 Go 语言中,return
语句可以被放在函数或方法中的任意位置。
return
语句的使用场景包括但不限于:
- 在函数或方法执行过程中,需要提前跳出函数或方法;
- 在函数或方法返回结果之前,需要对某些资源进行清理或释放;
- 函数或方法执行成功或失败后,需要返回相应结果给调用方;
- 函数或方法需要直接返回某个值,而不需要继续执行下去。
这里只讲解,提前跳出循环的案例:
func main() {for i := 1; i <= 100; i++ {fmt.Println(i)if i == 4 {return //结束当前的函数}}fmt.Println("hello golang")
}
输出:
1
2
3
4
Over~~~
第四章结束啦!!!下一步结构体,冲冲冲!!!
相关文章:

Go学习第四章——程序流程控制
Go学习第四章——程序流程控制 1 分支结构1.1 单分支1.2 双分支1.3 多分支1.4 switch分支 2 循环结构2.1 for循环2.2 while和dowhile的实现2.3 经典案例——打印金字塔2.4 经典案例——打印九九乘法表 3 跳转控制语句3.1 break3.2 continue3.3 goto3.4 return 流程控制的作用&a…...
自然语言处理---Transformer机制详解之Decoder详解
1 Decoder端的输入解析 1.1 Decoder端的架构 Transformer原始论文中的Decoder模块是由N6个相同的Decoder Block堆叠而成,其中每一个Block是由3个子模块构成,分别是多头self-attention模块,Encoder-Decoder attention模块,前馈全…...
【读书笔记】《软技能》
句子摘抄: 软技能-代码之外的生存指南 “自强不息 孜孜不倦” 强调了坚持不懈、不断奋斗和追求进步的精神。无论遇到多少困难和挫折,都要坚持努力,不断提高自己,不知疲倦地追求目标。这句谚语鼓励人们积极进取,不轻言…...

视频怎么压缩?视频过大这样压缩变小
在日常生活中,我们常常会遇到需要压缩视频的情况,视频压缩不仅可以减小文件大小,方便存储和传输,还可以在保证质量的同时,满足不同的使用需求。那么,如何有效地压缩视频呢? 方法一:嗨…...

蓝桥杯中级题目之组合(c++)
系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合(c)_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…...
julia 笔记:复合类型 struct
1 struct关键字 1.1 声明 struct关键字与复合类型一起引入,后跟一个字段名称的块,可选择使用 :: 运算符注释类型 struct Foobarbaz::Intqux::Float64end 没有类型注释的字段默认为 Any 类型,所以可以包含任何类型的值。 1.2 创建新对象 …...

【JavaEE初阶】 线程池详解与实现
文章目录 🌴线程池的概念🎄标准库中的线程池🍀ThreadPoolExecutor 类🚩corePoolSize与maximumPoolSize🚩keepAliveTime🚩ThreadFactory🚩workQueue🚩RejectedExecutionHandler handl…...

web:[极客大挑战 2019]HardSQL
题目 打开页面显示为 查看源代码没有发现其他的提示信息,随便尝试一下 错误 题目名为hardsql,先来尝试有无sql注入存在 尝试输入单引号输入 显示页面存在注入 这里按照常规思路继续使用order by函数和union select函数进行查询,但是页面没有…...

Android apkanalyzer简介
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、用法3.1 使用 Android Studio3.1.1…...
PJSIP 2.7.2对G.729的支持,编译bcg729步骤
PJSIP 2.7.2对G.729的支持,编译bcg729步骤 下载BCG729源码升级cmake编译BCG729编译pjsip2.7.2 pjsua测试 下载BCG729源码 git clone git://git.linphone.org/bcg729.git升级cmake 注:编译BCG729要求cmake版本大于3.0,如果版本已经达到要求&…...
(二)Python类型总结
Python 是一种面向对象的语言。这意味着在 Python 中,一切都是对象,包括变量、函数和模块。Python 支持类和对象的概念,通过定义类来创建对象,并使用对象的方法和属性来操作数据。 Python 与 Java 和 C 在数据类型方面有一些相似…...
pojo之vo_dto_po的一些理解
一次扫盲VO、DTO、DO和PO区别、用法、概念~-腾讯云开发者社区-腾讯云 (tencent.com) Java学习笔记——实体类(ENTITY,VO,DTO,BO)_dto继承entity_路言汐的博客-CSDN博客 说清楚PO、DTO、VO、BO与使用场景_业务逻辑层p…...
Leetcode 第 364 场周赛题解
Leetcode 第 364 场周赛题解 Leetcode 第 364 场周赛题解题目1:2864. 最大二进制奇数思路代码复杂度分析 题目2:美丽塔 I思路代码复杂度分析 题目3:美丽塔 II思路代码复杂度分析 题目4:统计树中的合法路径数目思路代码复杂度分析 …...
简单单调栈的运用,悬线法---最大子矩阵,整除分块(规律+分块边界)
简单单调栈的运用 牛客一站到底 最优屏障 题意:有n座山,高度位ai,山上的士兵能相互监督当且仅当max(ai1...aj-1)<min(ai,aj) M国的防守能力大小为相互监视的哨兵对数,H国家可以放一块巨大屏障在某山前,以便最大消弱M方式能力 计算最优的屏…...
华为OD 数组求和(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理
Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…...

【鸿蒙软件开发】进度条Progress
文章目录 前言一、进度条Progress1.1 创建进度条1.2 进度条样式进度条样式ProgressType.Linear(线性样式)ProgressType.Ring(环形无刻度样式)ProgressType.ScaleRing(环形有刻度样式)ProgressType.Eclipse&…...
Java后端开发(九)-- idea(2022版)将commit(未push)的 本地仓库 的 多条commit记录 进行撤销
目录 1.多次 修改Test01类后,提交到本地仓库 。 2.多次重复 1 的步骤,多次commit成功后,在Git =》Log中会显示,commit记录...

【蓝桥每日一题]-动态规划 (保姆级教程 篇10)#方格取数
高能预警:讲了这么久动态规划了,该上点有难度的题吧 目录 题目:方格取数 思路(解法一): 解法二: 题目:方格取数 思路(解法一): 如果只有两个方向…...

Git GUI工具:SourceTree代码管理
Git GUI工具:SourceTree SourceTreeSourceTree的安装SourceTree的使用 总结 SourceTree 当我们对Git的提交、分支已经非常熟悉,可以熟练使用命令操作Git后,再使用GUI工具,就可以更高效。 Git有很多图形界面工具,这里…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...

Android Framework预装traceroute执行文件到system/bin下
文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数(使用 ICMP Echo 请求)-T 参数(使用 TCP SYN 包) 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11,在/s…...