第三章 go语言 程序的流程控制
程序的流程控制主要包括三种不同的结构,分别是顺序结构、选择结构和循环结构。
² 顺序结构最为简单,程序执行时,按照语句的顺序自上而下依次执行。
² 选择结构是根据条件表达式的结果选择执行某些语句。
² 循环结构是重复执行执行某些语句。
3.1 选择结构
3.1.1 if语句的语法:
// 1 if condition { ... } // 2 if condition { ... } else { ... } // 3 if condition { ... } else if condition { ... } // 4 if condition { ... } else if condition { ... } else { ... } |
注意事项:
- 不需要使用括号()将条件包含起来。
- 无论语句体内有几条语句,花括号{}都必须存在。
- 左花括号{必须与if或else同处一行,否则有编译器错误
- else必须和上一个语句体结束的右花括号}同处一行,否则有编译错误
- 在if之后可以添加变量初始化语句,但需要使用分号;间隔
惯用法:if 语句条件前面可以前置一条初始化语句,而go语言中的函数可以返回多个值,有很多函数第二个返回值是 error 类型,则我们可以通过
if v, err := func(); err == nil { //逻辑语句 } |
四种不同if结构的案例如下:
package main import "fmt" func main() { fmt.Println("请输入您的成绩(0~100)") var grade int fmt.Scanln(&grade) // 1 错误判断 if (grade < 0) || (grade > 100) { fmt.Println("您输入的成绩有误!") return } // 2 判断是否及格 if grade >= 60 { fmt.Println("及格") } else { fmt.Println("不及格") } // 3 打印等级 if (grade >= 90) && (grade <= 100) { fmt.Println("A") } else if (grade >= 80) && (grade < 90) { fmt.Println("B") } else if (grade >= 70) && (grade < 80) { fmt.Println("C") } else if (grade >= 0) && (grade < 70) { fmt.Println("D") } // 4 比较两个数值的大小 fmt.Println("请输入两个整数:") var a, b int fmt.Scanln(&a, &b) if a > b { fmt.Println(a, "大于", b) } else if a < b { fmt.Println(a, "小于", b) } else { fmt.Println(a, "等于", b) } } |
3.1.2 switch语句
switch语句的语法:
switch condition { case v0: ... case v1: ... case v2: ... case v3: ... case v4, v5, v6: ... default: ... } |
注意事项:
1.左花括号{必须与switch同处一行。
2.case后可以使用常量,还可以使用变量。
package main import "fmt" func main() { condition := 0 caseValue := 0 switch condition { case caseValue: fmt.Println("0") case 1: fmt.Println("1") default: fmt.Println("Default") } } |
注意事项:
- 单个case后可以出现多个结果选项。
- 不需要用break来明确退出一个case。
- 只有在case中明确添加fallthrough关键字,才会继续执行下一个case。
package main import "fmt" func main() { condition := 1 switch condition { case 0: fmt.Println("0") case 1: fmt.Println("1") fallthrough default: fmt.Println("Default") } } |
可不设定switch后的条件表达式,在此种情况下整个switch结构与if...else...的逻辑等同。
package main import "fmt" func main() { num := 1 switch { case 0 <= num && num <= 3: fmt.Println("0-3") case 4 <= num && num <= 6: fmt.Println("4-6") case 7 <= num && num <= 9: fmt.Println("7-9") } } |
例子:根据输入的年份月份计算月份的天数?
package main import "fmt" func main() { fmt.Println("请输入年份月份:") var month int var year int fmt.Scanln(&year, &month) switch month { case 1, 3, 5, 7, 8, 10, 12: fmt.Println("31天") case 4, 6, 9, 11: fmt.Println("30天") case 2: if (year%4 == 0 && year%100 != 0) || (year%400 == 0) { fmt.Println("29天") } else { fmt.Println("28天") } default: fmt.Println("输入的月份有误!") } } |
3.2 循环结构
接下来,我们来看循环结构,在其它编程语言中,循环结构一般至少包括for、while和do while语句三种,但是在Go语言中,循环结构只有for语句,没有while和do while语句。因为for语句经过变体是可以完全替代其它语句的,这也体现了Go语言的简洁性。
3.2.1 for语句
for语句的语法如下:
// 普通循环 for 初始化表达式; 条件表达式; 步进表达式 { 循环体语句 } |
首 先执行初始化表达式,然后执行条件表达式,如果条件表达式的结果为真,执行循环体语句和步进表达式。然后再回到条件表达式进行判断,周而复始的重复执行。如果条件表达式的结果为假,直接跳出for循环,意味这整个for循环结束。
普通for循环的流程图:
我们看一个for循环的例子,求1~100的数值的和。
package main import "fmt" func main() { //保存结果 var sum int = 0 // i表示1~100 for i := 1; i <= 100; i++ { sum = sum + i } fmt.Println("sum:", sum) } |
省略表达式1:
package main import "fmt" func main() { var sum int = 0 i := 1 for ; i <= 100; i++ { sum = sum + i } fmt.Println("sum:", sum) } |
省略表达式2:
package main import "fmt" func main() { var sum int = 0 i := 1 for ; ; i++ { if i > 100 { break } sum = sum + i } fmt.Println("sum:", sum) } |
省略表达式3:
package main import "fmt" func main() { var sum int = 0 i := 1 for { if i > 100 { break } sum = sum + i i++ } fmt.Println("sum:", sum) } |
数组循环:
// 数组循环 for i, v := range array { ... } |
注意事项:
1) 只支持for结构,不支持while和do-while结构。
2) 左花括号{必须与for处于同一行。
3) 不支持以逗号为间隔的多赋值语句,支持使用多元赋值的方式来初始化多个变量。这个很好判断,在一个表达式中不允许有多个赋值语句,即:=或=。
package main import "fmt" func main() { array := []int{1, 2, 3, 4, 5, 6} for i, j := 0, len(array)-1; i < j; i, j = i+1, j-1 { array[i], array[j] = array[j], array[i] } fmt.Println(array) } |
3.2.2 continue和break语句
continue语句在for循环结构中的作用是结束本次循环,即跳过循环体中下面还没有执行的语句,接着进行下一次循环。break语句在循环结构中的作用是跳出循环体,提前结束循环。
例如:打印1~10之间可以被3整除的数下:
package main import "fmt" func main() { for i := 1; i <= 10; i++ { if i%3 != 0 { continue } fmt.Println("i=", i) } } |
3.3 goto语句
goto语句是跳转语句,天生要和标签配合使用。可以让程序无条件的跳转到标签之处继续执行。一般的语法格式:
goto LABEL ... ... ... LABEL: |
案例如下:
package main import "fmt" import "time" func main() { i := 0 for { i++ if i >= 10 { goto FINISH } fmt.Print(i, " ") time.Sleep(1 * time.Second) } FINISH: fmt.Println("\nFinish") } |
第三章 go语言 程序的流程控制的更多相关文章
- 第二章(java程序设计)第三章(语言基础)
第二章 2.1 对象 对象的概念是由现实世界引入问题模型: 对象包含有:状态和行为.具体地来说是: 数据封装:对象的方法的作用就是:将内部变量封装起来,提供给外界交互的窗口.(实现对数据的隐藏) 继承 ...
- linux内核代码注释 赵炯 第三章引导启动程序
linux内核代码注释 第三章引导启动程序 boot目录中的三个汇编代码文件 bootsect.s和setup.s采用近似intel的汇编语法,需要8086汇编器连接器as86和ld86 head ...
- Go语言 数据类型,流程控制
Go语言 数据类型,流程控制 人生苦短,Let's Go ! package main // 必须要有一个main包 import "fmt" func main() { fmt. ...
- Go语言基础之流程控制
Go语言基础之流程控制 流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”. Go语言中最常用额流程控制有if和for,而switch和goto主要是为了简化代 ...
- GO语言学习——Go语言基础之流程控制一
Go语言基础之流程控制 if else(分支结构) package main import "fmt" // if条件判断 func main(){ // age := 19 // ...
- 第2章 Java基本语法(下): 流程控制--项目(记账本)
2-5 程序流程控制 2-5-1 顺序结构 2-5-2 分支语句1:if-else结构 案例 class IfTest1{ public static void main(String[] args) ...
- 1.4 Go语言基础之流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...
- Go 从入门到精通(三)字符串,时间,流程控制,函数
一.strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判断字符串s是否以prefix开头 stirn ...
- Go语言学习笔记-流程控制(二)
Go语言流程控制 字典类型Map 1.上节遗留:map字典类型 变量声明:var myMap map[string] PersonInfo 其中,myMap是变量名,string是键的类型,Perso ...
随机推荐
- LintCode-丑数
设计一个算法.找出仅仅含素因子3,5,7 的第 k 大的数. 符合条件的数如:3.5.7,9,15...... 您在真实的面试中是否遇到过这个题? Yes 例子 假设k=4, 返回 9 挑战 要求时间 ...
- ajax接受json响应
一.显示页面(ajax_xml.html) body部分 <!-- 支持多选的列表框 --> <select name="first" id="firs ...
- 详解Office Add-in 清单文件
作者:陈希章 发表于2017年12月8日 前言 我们都知道,一个Office Add-in,最主要是由两个部分组成的:清单文件(manifest)和真正要用来执行的网站. 清单文件其实是一个标准的XM ...
- 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)
作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...
- 如何在Gulp中提高Browserify的打包速度
使用Browserify打包js时如果项目变得越来越大,编译时间就会相应变得越来越长.使用官方的插件watchify是个比较有效的提高速度方案. 提速原理 watchify的用法和gulp的watch ...
- 稀疏分解中的MP与OMP算法
MP:matching pursuit匹配追踪 OMP:正交匹配追踪 主要介绍MP与OMP算法的思想与流程,解释为什么需要引入正交? !!今天发现一个重大问题,是在读了博主的正交匹配追踪(OMP)在稀 ...
- sed从入门到深入修炼目录
sed系列文章: sed修炼系列(一):花拳绣腿之入门篇sed修炼系列(二):武功心法(info sed翻译+注解)sed修炼系列(三):sed高级应用之实现窗口滑动技术sed修炼系列(四):sed中 ...
- JeeSite如何正确连接SQL SERVER 数据库
JeeSite如何正确连接SQL SERVER 数据库 jeesite介绍 感谢jeesite项目的作者thinkgem. 没有你我也不会更改这数据源非了恁大的劲,,,,嘻嘻嘻说多了. JeeSite ...
- 小白的Python之路 if __name__ == '__main__' 解析
if __name__ == '__main__' 参考文献: http://www.cnblogs.com/xuxm2007/archive/2010/08/04/1792463.html http ...
- IX-Protected Dataplane Operating System解读
一.概述 商业操作系统在应用程序每秒钟需要数百万次操作时才能保持高吞吐量和低(尾)延迟,对于最慢的请求只需几百微秒.通常认为对于高性能网络(小信息的高包率.低延迟)的构建,最好都是在内核之外构建用户态 ...