目录
在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。
- 顺序控制
- 分支控制
- 循环控制
顺序控制
程序从上到下逐行的执行,中间没有任何判断和跳转。
分支控制
让程序有选择的执行,分支控制有三种:
(1)单分支
if 条件表达式 {
//执行代码块
}
(2)双分支
if 条件表达式 {
//执行代码块
} else {
//执行代码块
}
(3)多分支
if 条件表达式1 {
//执行代码块
} else if 条件表达式2 {
//执行代码块
} else {
//执行代码块
}
注意:
(1) {}是必须有的,就算你只写一行代码;
(2) 条件表达式不需要小括号括起来
(3)块内声明的变量的作用域只在该块内
(4)golang支持在if中,直接定义一个变量
if age := 20; age > 18 {
//代码块
}
(5)if语句的条件表达式不能是赋值语句
if b = false { //错误
}
(6)if语句的条件表达式的结果必须是bool值
n := 4
if n { //错误
}
switch
switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上到下逐一测试,直到匹配位置。
匹配项后面也不需要再加break
基本语法:
switch 表达式 {
case 表达式1,表达式2, ... :
语句块
case 表达式3,表达式4, ... :
语句块
case 表达式5:
语句块
default:
语句块
}
流程图
switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应的case的语句块,然后退出switch控制,如果一个都匹配不到,则执行default。
default语句不是必须的。
如果switch的表达式的值没有和任何的case的表达式匹配成功,则执行default的语句块。执行后退出switch的控制。
golang的case后的表达式可以有多个,使用逗号间隔。
golang中的case语句块不需要写break,因为默认会有,即在默认情况下,当程序执行完case语句块后,就直接退出该switch控制结构。
fallthrough:与下面的一个case条件属于逻辑或的关系,相等于给下面的一个case增加了一个逻辑或的条件
case后面的各个表达式的值的数据类型,必须和switch的表达式数据类型一致
package main import "fmt" func main() { var num1 int32 = 20 var num2 int64 = 20 switch num1 { case num2: fmt.Println("相等呢") case 30: fmt.Println("哈哈") } } //运行时报错 invalid case num2 in switch on num1 (mismatched types int64 and int32)
但是如果里面是一个数字,则可以的,因为数字本身是不带类型的
package main import "fmt" func main() { var num1 int32 = 20 switch num1 { case 20.0: fmt.Println("相等呢") case 30: fmt.Println("哈哈") } }
golang中switch后面的表达式甚至不是必须的
Type switch
switch语句还可以被用于type-switch来判断某个interface变量中实际存储的变量类型。
Type Switch语法格式如下:
switch x.(type) { case type: statement(s); case type: statement(s); //你可以定义任意个数的case default: /*可选*/ statement(s); }
示例:
package main import "fmt" func main() { var x interface{} switch i := x.(type) { //x.()格式是类型断言 case nil: fmt.Printf("x 的类型是: %T", i) case int: fmt.Printf("x 的类型是: int") case float64: fmt.Printf("x的类型是: float64") case func(int) float64: fmt.Printf("x的类型是: func(int)") case bool, string: fmt.Printf("x的类型是: bool或string") default: fmt.Printf("未知型") } } //以上代码的执行结果为: x 的类型是: <nil>
case后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
case后面的表达式如果是常量值(字面量),则要求不能重复
package main import "fmt" func main() { var n1 int32 = 5 var n2 int32 = 20 var n3 int32 = 5 switch n1 { case n2, 10, 5: fmt.Println("case1") case 5: //这里不允许重复出现数字5,但是如果我们把5替换成变量n3就不会报错 fmt.Println("case2") } }
switch后面也可以直接声明/定义一个变量,分号结束,不推荐
switch grade := 90; { case grade > 90: fmt.Println("成绩优秀...") case grade >= 60 && grade <= 90: fmt.Println("成就优良") default: fmt.Println("不及格") }
switch和if的比较
如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型,建议使用switch语句,简洁高效。
其他情况:对区间判断和结果为bool类型的判断,使用if,if使用的范围更广
循环控制
Go语言中的循环语句只支持for关键字,不支持while和do-where结构。
for
语法:
Go语言的for循环有三种形式,只有其中的一种使用分号。
和C语言的for一样:
for init; condition; post {}
和C的while一样:
for condition {}
和C的for(;;)一样:
for {}
init:一般为赋值表达式,给控制变量赋初值;
condition:关系表达式或逻辑表达式;循环控制条件
post:一般为赋值表达式,给控制变量增量或减量。
for循环的range格式