流程控制语句
程序是由语句构成,而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程控制语句,功能也都基本相似。
其流程控制方式有
- 顺序结构
- 分支结构
- 循环结构
这里最简单最常用的就是顺序结构,即语句从上至下一一执行。
分支语句
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。
单分支语句
语法:
if 布尔表达式 { // 注意左花括号必须与表达式同行
/* 在布尔表达式为 true 时执行 */
}
双分支语句
双分支语句顾名思义,二条分支二选一执行!
语法:
if 布尔表达式 {
***
}else {
***
}
if
多分支语句
多分支即从比双分支更多的分支选择一支执行。
语法:
if 布尔表达式 {
***
}else if 布尔表达式 {
***
}else if 布尔表达式 {
***
}else if 布尔表达式 {
***
}else{
***
}
不管多少条分支只能执行一条分支!
switch
多分支语句
语法:
switch var {
case val1:
...
case val2:
...
default:
...
}
switch语句也是多分支选择语句,执行哪一代码块,取决于switch后的值与哪一case值匹配成功,则执行该case后的代码块。
/*
给出如下选项,并根据选项进行效果展示:
输入1:则输出"普通攻击"
输入2:则输出"超级攻击"
输入3:则输出"使用道具"
输入3:则输出"逃跑"
*/
var choice int
fmt.Println("请输入选择:")
fmt.Scanln(&choice)
//fmt.Println(choice,reflect.TypeOf(choice))
switch choice {
case 1:fmt.Println("普通攻击")
case 2:fmt.Println("超级攻击")
case 3:fmt.Println("使用道具")
case 4:fmt.Println("逃跑")
default:fmt.Println("输入有误!")
}
1、switch比if else更为简洁
2、执行效率更高。switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
3、到底使用哪一个选择语句,代码环境有关,如果是范围取值,则使用if else语句更为快捷;如果是确定取值,则使用switch是更优方案。
switch同时支持多条件匹配:
switch{
case 1,2:
default:
}
分支嵌套
// 分支嵌套
var user string
var pwd int
fmt.Printf("请输入用户名:")
fmt.Scanln(&user)
fmt.Printf("请输入密码:")
fmt.Scanln(&pwd)
if user == "yuan" && pwd==123{
var score int
fmt.Printf("请输入成绩:")
fmt.Scanln(&score)
if score >= 90 && score<=100 {
fmt.Println("成绩优秀!")
} else if score >= 80 {
fmt.Println("成绩良好!")
} else if score >= 60 {
fmt.Println("成绩及格")
} else {
fmt.Println("不及格!")
}
}else {
fmt.Println("用户名或者密码错误!")
}
循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。
与其它主流编程语言不同的的是,Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构。
for循环
原始for循环
通过关系表达式或逻辑表达式控制循环
for condition { }
简单循环案例:
count := 0 // 初始化语句
for count<10 { // 条件判断
fmt.Println(count)
count ++ // 步进语句
}
无限循环案例:
/*
无限循环
for true{
}
*/
// 循环中嵌入分支语句
func main() {
fmt.Printf(`
1、普通攻击
2、超级攻击
3、使用道具
4、逃跑
`)
for true {
var choice int
fmt.Printf("请输入选择:")
fmt.Scanln(&choice)
//fmt.Println(choice,reflect.TypeOf(choice))
switch choice {
case 1:
fmt.Println("普通攻击")
case 2:
fmt.Println("超级攻击")
case 3:
fmt.Println("使用道具")
case 4:
fmt.Println("逃跑")
default:
fmt.Println("输入有误!")
}
}
}
三要素for循环(核心)
将初始化语句、条件判断以及步进语句格式固定化的循环方式,本质上和上面的for循环没有区别。
for init;condition;post {
// 循环体语句
}
-
init
: 初始化语句,一般为赋值表达式,给控制变量赋初值; -
condition
:条件判断,一般是关系表达式或逻辑表达式,循环控制条件; -
post
: 步进语句,一般为赋值表达式,给控制变量增量或减量。
for i := 1; i < 10; i++ {
fmt.Println(i)
}
执行流程:
退出循环
关键字:
break
退出循环
当 break 关键字用于 for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足某个条件时便跳出循环,继续执行循环语句下面的代码。
for i := 0; i < 10; i++ {
if i==8{
break
}
fmt.Println(":",i)
}
continue
不同于break退出整个循环,continue指的是退出当次循环。
for i := 0; i < 10; i++ {
if i==8{
continue
}
fmt.Println(":",i)
}
循环嵌套
在一个循环体语句中又包含另一个循环语句,称为循环嵌套
独立嵌套
在控制台上打印一个五行五列的矩形,如下图所示
*****
*****
*****
*****
*****
for i := 0; i < 5; i++ {
for j:=0;j<5;j++ {
fmt.Print("*")
}
fmt.Print("\n")
}
关联嵌套
在控制台上打印一个如下图所示的三角形
*
**
***
****
*****
for i := 0; i < 5; i++ {
for j := 0; j <= i; j++ {
fmt.Printf("*")
}
fmt.Println()
}