Go语言实战学习之流程控制详解
作者:xiaoyaoyou.xyz 发布时间:2024-05-09 14:57:06
1. 前言
这里还是再总结一下流程控制,和其它语言相比做了一些优化,比如相比c增加了迭代器类型的for循环,switch针对c中容易出问题的地方做了一些修改,避免出现缺少break时存在的常见问题,此外,和Java类似也存在跳出循环和多层嵌套的方法,C中容易造成使用不当的goto也同样支持,在解决比较麻烦的go错误处理时goto有奇效,但基本上还是不太建议使用。
本次总结的内容主要如下:
2. if分支
if语句基本和C语言的if类似(由于Go的语法不需要括号以及使用分号换行,所以写起来是更加高效的):
if xxx {
xxx
} else if {
xxx
} else if {
xxx
} else {
xxx
}
示例:
判断任意年份是否为闰年,需要满足以下条件中的任意一个:
① 该年份能被 4 整除同时不能被 100 整除;
② 该年份能被400整除。
package main
import "fmt"
func main() {
var a int
fmt.Println("请输入年份:")
fmt.Scan(&a)
if a % 400 == 0 {
fmt.Println("该年是闰年")
} else if (a % 4 == 0) && (a % 100 != 0) {
fmt.Println("该年是闰年")
} else {
fmt.Println("该年不是闰年")
}
}
结果:
3. for及for-range循环
除了传统的for循环,目前较新的语言都是支持迭代器方式的for循环的,go也不例外,通过range关键词来迭代获取对应的key、value值进行迭代进行循环。
示例:
package main
import "fmt"
func main() {
var i int
sum := 0
for i = 0; i < 100; i++ {
sum+=i
}
fmt.Println(sum)
arr := [...]int{1,2,3,4,5}
for k,v := range arr {
fmt.Println(k, v)
}
}
结果:
4. switch-case-fallthrough分支
在C中switch-case之后跳出某个分支是需要break的,新手往往会忘记break从而引起bug,因此在Go中去掉了分支结束需要break跳出的方式,case分支结束后就自动跳出该分支了;对于某些特殊需求比如多个case分支共用一个执行语句或这个分支结束后想继续执行下一个分支,那么使用fallthrough来避免执行后跳出对应的case分支,当然,这种方式是不提倡的。
示例:
package main
import "fmt"
func main() {
var a int
fmt.Println("请输入1-7:")
fmt.Scan(&a)
switch a {
case 1:
fmt.Println("星期一")
case 2:
fmt.Println("星期二")
case 3:
fmt.Println("星期三")
case 4:
fmt.Println("星期四")
case 5:
fmt.Println("星期五")
case 6:
fmt.Println("星期六")
case 7:
fmt.Println("星期天")
default:
fmt.Println("未知")
}
//fallthrough
switch a {
case 1:
fmt.Println("星期一")
case 2:
fmt.Println("星期二")
case 3:
fmt.Println("星期三")
case 4:
fmt.Println("星期四")
case 5:
fmt.Println("星期五")
case 6:
fmt.Println("星期六")
fallthrough
case 7:
fmt.Println("周末")
default:
fmt.Println("未知")
}
}
结果:
5. goto
goto语句我觉得处理错误时比较好用,因为没有抛出异常,很可能会出现很多判断err的情况,这种的可以使用goto统一处理,但是怎么说那,goto语句这种跳转还是会造成一定的风险,基本上还是不太建议使用。
示例:
package main
import "fmt"
func main() {
var a int
fmt.Println("请输入1-7:")
_, err := fmt.Scan(&a)
if err != nil {
goto errTodo
}
_, err = fmt.Println(a)
if err != nil {
goto errTodo
}
errTodo:
fmt.Println("错误处理")
}
结果:
6. break和continue
由于go没有while循环,一般是使用for循环来代替的,要跳出循环或者逻辑判断后直接进行下一次循环的话还是需要break和continue。
示例:
package main
import "fmt"
func main() {
for {
var a int
fmt.Println("请输入1-7:")
_, err := fmt.Scan(&a)
if err != nil {
fmt.Println(err)
continue
}
if (a < 1) || (a > 7) {
fmt.Println("非法的输入")
continue
}
if (a >= 1) && (a <= 7) {
fmt.Println("输入正确:", a)
break
}
}
}
结果:
7. 跳出嵌套循环
对于嵌套循环,我们有时候需要跳出外层循环,这时go也是借助于类似Java等的命名空间的方式break跳出嵌套循环。
示例:
package main
import "fmt"
func main() {
first:for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
fmt.Println(i * j)
if i * j == 4 {
break first
}
}
}
}
结果(可以试一下不加first只有break的话会跳出到哪里):
8. 最后
基本上流程控制就这些了,相较于C,go去除了while循环,for循环完全是足够的,增加了for range这种迭代方式的循环,此外,switch上也去除了容易犯错的必须加break的地方,对于有特殊需求的也增加了fallghrough来处理,嵌套循环跳出的方式和Java等是比较类似的。
来源:https://blog.csdn.net/weixin_39510813/article/details/126592302


猜你喜欢
- 问题描述:使用scn号恢复误删数据1.查询系统闪回的scn值以及当前日志的scn值,因为我这个是测试,创建的表是在在后边,所以scn值要大于
- pprint – 美观打印作用:美观打印数据结构pprint 包含一个“美观打印机”,用于生成数据结构的一个美观视图。格式化工具会生成数据结
- 如何将产生的密码记录并发送给用户?这里使用了cdonts邮件组件来发送邮件,前提服务器得支持cdonts组件。好了,看看具体实现方法吧,不是
- 写在前面嗯,学习GO,所以有了这篇文章博文内容为《GO语言实战》读书笔记之一主要涉及映射相关知识你要爱就要像一个痴情的恋人那样去爱,像一个忘
- 虽然我们一直使用书籍搜索的示例表单,并将起改进的很完美,但是这还是相当的简陋: 只包含一个字段,q。这简单的例子,我们不需要使用Django
- 1.软件环境Windows10 教育版64位Python 3.6.32.问题描述我们在定义一个函数或者是调用一个函数的时候,总是希望能够知道
- 实现思路很多网站都有拼图验证码1.首先要了解拼图验证码的生成原理2.制定破解计划,考虑其可能性和成功率。3.编写脚本很多网站的拼图验证码都是
- 成员运算符Python 提供了两个成员运算符来检查或验证值的成员资格。它测试序列中的成员资格,例如字符串、列表或元组。 in 运算
- 测试的过程中经常需要截取屏幕,通常的做法是使用手机自带的截屏功能,然后将截屏文件复制出来,这种方法的优点是不需要连接数据线就可截屏,缺点则是
- 代码如下: EXEC sp_rename '表名.[原列名]', '新列名', 'column
- AES加密AES对称加密简介AES是一个对称密码,旨在取代DES成为广泛使用的标准。是美国联邦政府采用的一种区块加密标准。AES对称加密过程
- 环境:python3 + unittest + requestsExcel管理测试用例,HTMLTestRunner生成测试报告测试完成后邮
- InstrRev描述:返回某字符串在另一个字符串中出现的从结尾计起的位置。语法:InstrRev(string1, string2
- 前言:列表框控件显示多行文本,用户可以选中一行或者多行。所有的文本只能使用一种字体,不能混合使用多种字体。1 属性常用的参数列表如下:1.1
- 通常,由于类别不均衡,需要使用weighted cross entropy loss平衡。def inverse_freq(label):
- 你还没用 jQuery 写过导航菜单? 相信看到这些出色的jQuery导航菜单后,一定会为此而后悔没早点把 jQuery 应用到自己的Web
- 1.BeautifulSoup简介BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解
- 为什么说浮点数缺乏精确性?在开始本文之前,让我们先来谈谈浮点数为什么缺乏精确性的问题,其实这不是Python的问题,而是实数的无限精度跟计算
- 迭代器跟生成器,与上篇文章讲的装饰器一样,都是属于我的一个老大难问题。通常就是遇到的时候就去搜一下,结果在一大坨各种介绍博客中看了看,回头又
- 解决2个问题:1.身份证之类的文本数据自动转为科学计数法的问题。2.中文乱码的问题excel从web页面上导出的原理。当我们把这些数据发送到