流程介绍
在程序中,程序运行的流程控制决定程序是如何进行的,主要有三大类
- 顺序控制
- 分支控制
- 循环控制
顺序控制
不存在判断和跳转,完全按照代码顺序进行
分支控制
分支控制就是让程序有选择的进行
- 单分支
- 双分支
- 多分支
- 嵌套分支
- switch分支结构
分支结构,不管是哪种,都只有执行其中一个代码块,或者全部不执行,不可能存在执行多个代码块的情况
单分支
结构:
if 条件表达式 {
执行语句块
}
当条件表达式为true时,才执行执行语句块
golang中这对{}是必须要有的,不像一些语言在只写一行代码时可以省略
golang中的if语句有个奇怪的特点,就是可以在条件表达式中声明一个变量。
双分支
结构:
if 条件表达式 {
执行语句块1
}else{
执行语句块2
}
重点强调golang的else必须紧跟在if的下括号后面
func main() {
// fmt.Scanln(&age)
if age := 20; age > 18 {
fmt.Println(“成年人”)
} else {
fmt.Print(“未成年”)
}
}
在此段代码中,如果if中的条件表达式为true,则输出成年人,如果为false,则输出未成年
多分支
if 条件表达式1 {
执行语句块1
}else if 条件表达式2 {
执行语句块2
}else{
执行语句块3
}
代码示例:
var num1 = 10
var num2 = 20
if numsum1 := num1 + num2; numsum1 < 10 {
fmt.Println(“1”)
} else if numsum1 < 20 {
fmt.Println(“2”)
} else if numsum1 < 30 {
fmt.Println(“3”)
} else {
fmt.Println(“4”)
}
注意事项
var b =true
if b=false{
fmt.Println(“1”)
}else{
fmt.Println(“2”)
}
在其它语言中可能可以输出2
但是,这样的语句在golang中是会报错的,报错原因是:cannot use assignment b = false as value
就是说golang的if后面必须跟的是条件表达式!!!
而且在golang中,你改成b==false,系统还是会建议你改成!b这样子的形式,更简洁
嵌套分支
如果在一个完整的分支结构中,又存在一个完整的分支结构,则称为嵌套分支。
结构:
if …{
if…{
…
}
}else{
}
switch分支
基本介绍:
- 在不断寻找匹配项,执行匹配项的代码
- 匹配项后面不需要加上break(与其它语言有所区别)因为golang默认在每个case后加上break
结构:
switch 表达式{
case 表达式1,表达式2,…:
语句块1
case 表达式3,表达式4,…:
语句块2
…
default:
语句块
}
只要匹配到表达式1或者表达式2,就能够执行语句块1
switch的使用细节
- case后面跟的是表达式(即:常量值,变量,一个有返回值的函数等)
- case后各个表达式的类型必须和switch后面表达式的类型一致
- case后的多个表达式用逗号间隔
- case后的表达式如果是常量值,要求不能重复(在所有的case后的常量都不能重复)
但是,如果一个常量是5,一个变量虽然也是被赋值为5,但是这可以正常运行 - case后不需要break,匹配项结束后,switch分支就结束,没有匹配项就执行default
- default语句不是必须的
- switch后面可以不加任何的表达式,就完全当作if-else语句来进行使用
代码用例:
var a int =9
switch {
case a == 10, a == 9:
fmt.Println(“1”)
default:
fmt.Println(“2”)
} - switch后面可以直接声明或者定义一个变量,以分号结尾(不常用不推荐,做了解)
switch a :=9;{
case a == 10, a == 9:
fmt.Println(“1”)
default:
fmt.Println(“2”)
} - switch穿透fallthrough,如果在case的执行代码块的末尾加上fallthrough,就会在执行完这个语句后执行下一个case或者default,只能穿透一层。
注意:fallthrough只能加在每个case执行语句块的末尾
代码示例
switch a := 9; {
case a == 10, a == 9:
fmt.Println(“1”)
fallthrough
default:
fmt.Println(“2”)
} - switch还可以用type-switch来判断interface变量实际指向的数据类型
代码示例
var x interface{}
var y = 10.9
x = y
switch x.(type) {
case nil:
fmt.Println(“0”)
case int:
fmt.Println(“1”)
case float64:
fmt.Println(“2”)
case bool:
fmt.Println(“3”)
}
switch和if的区别
switch分支适用于在具体数字不多,而且是int,float型的情况
if分支使用于范围判断的,和bool型(并且if的适用范围更广)