Go语言基础(程序流程控制)
\ \quad 在程序中,程序运行的流程控制决定了程序是如何执行的,主流的程序设计语言一般有三大流程控制语句:分别是 顺序控制、 分支控制和 循环控制。
\ \quad
Go
语言的常用流程控制有if
、for
、switch
和goto
。
一、顺序控制
1.1 顺序控制介绍
\ \quad 所谓的顺序控制就是程序从上到下逐行的执行,中间没有任何判断和跳转。
1.2 流程图
1.3 顺序控制举例和注意事项
-
Golang
中定义变量时要采用合法的前向引用。如:
错误形式:不可以先使用变量后声明func main() { var num1 int = 10 // 声明 num1 var num2 int = num1 + 20 // 使用 num1 fmt.Println(num2) }
func main() { var num2 int = num1 + 20 // 使用 num1 var num1 int = 10 // 声明 num1 fmt.Println(num2) }
二、分支控制
\ \quad 在实际应用中,有时需要通过某个判断来决定任务是否执行或者执行的方式。对于这样的情况,仅有顺序结构控制是不够的,需要选择结构,也就是分支控制语句。
\ \quad
所谓的分支控制就是让程序执行到某个位置的时候有一个判断,判断结果为布尔值,如果布尔值为true
则执行某一块代码,布尔值为false
则执行另一块代码。分支控制主要有三种形式:单分支、双分支和多分支。
2.1 单分支结构
- 若条件成立时需要执行某些操作,不成立时不执行操作,则需要编写单分支结构。
-
Golang
中的if
语句实现了单分支控制结构,用来实现有条件地执行语句的功能。 -
if
语句单分支结构的语法形式如下,当条件判断表达式为true
时,就会执行{ }
的代码,如果为false
则不执行。if condition { /* 在条件判断表达式为 true 时执行 */ }
-
if
:条件判断使用的关键字。 -
condition
:条件判断表达式。
-
-
Go
语言中的if
语句后面的条件判断表达式,不需要也不能加小括号,即()
,这是Go
语言与其他语言if
语句的区别。 -
Go
语言if
语句后面的大括号必须跟条件表达式写在一行,不能换行写,换行写会编译错误。 -
Go
语言if
语句{ }
是必须有的,就算只写一行代码也必须加上。 -
Go
的if
还有一个强大的地方就是判断条件语句里面允许声明一个变量,这个变量的作用域只能在该条件逻辑块内,其他地方就不起作用了。 - 单分支结构流程图:
- 示例:判断年龄是否成年
func main() { age := 20 if age > 18 { fmt.Println("您已经成年") } }
- 条件判断语句里面声明变量
func main() { if age := 20; age >= 18 { fmt.Println("您已经成年") } }
- 条件判断语句里面声明变量
2.2 双分支结构
- 若条件成立时需要执行某些操作,不成立时需要执行另外一些操作,则需要编写双分支结构。
- 在
Go
语言中,关键字else
是用于在if
条件不满足时执行的代码逻辑。else
后面一定不能加判断条件,否则会语法错误。 -
Go
编程语言中if...else
语句的语法如下,if
在条件判断表达式为true
时,其后紧跟的语句块执行,如果为false
则执行else
语句块。if condition { /* 在条件判断表达式为 true 时执行 */ } else { /* 在条件判断表达式为 false 时执行 */ }
-
if
:条件判断使用的关键字。 -
condition
:条件判断表达式。
-
- 双分支结构流程图:
- 示例:判断年龄是否成年,如果未成年则输出年龄
func main() { if age := 16; age > 18 { fmt.Println("您已经成年") } else { fmt.Printf("%d岁还未成年", age) } }
2.3 多分支结构
2.3.1 if … else if 分支控制
- 若条件成立时需要执行某些操作,不成立时需要执行后续多个逻辑判断,直到满足条件时执行某些操作,则需要编写多分支结构。
- 在
Go
语言中,关键字if
是用于测试某个条件(布尔型
或逻辑型
)的语句是否满足一定的条件,如果满足特定的条件,则会执行if
后由大括号{ }
括起来的代码块,否则就忽略该代码块继续执行后续的代码。 -
else if
关键字用于在if
语句条件不满足的情况下,继续执行else if
里面的逻辑判断,如果满足条件则执行else if
大括号里面的逻辑。 -
else if
语句只能写在if
语句的大括号的后面,且else if
语句可以写任意多个。 -
Go
编程语言中if ... else if
语句的语法如下,if
在条件判断表达式为true
时,其后紧跟的语句块执行,如果为false
则执行后续多个else if
语句块,直到else if
的条件判断表达式为true
时执行紧跟的语句块。if condition { // do something } else if condition1 { // do something1 } else if condition2 { // do something2 } ...... } else if conditionN { // do somethingN }
-
Go
语言中的else if
语句后面的条件判断表达式,同样也不需要加小括号,即()
,类似于if
语句。同理,Go
语言else if
语句后面的大括号必须跟else if
条件表达式写在一行,不能换行写,换行写会编译错误。 - 上述语句,如果
if
语句的条件表达式成立,那么就会只执行if
的逻辑do something
,如果if
条件表达式不成立,那么会判断表达式condition1
。 - 如果表达式
condition1
成立,那么会执行do something1
,仅仅在表达式condition1
不成立时,才会判断表达式condition2
,如果表达式condition2
成立,那么执行do something2
,否则,继续向后执行,直到条件判断表达式成立。如果所有条件判断表达式均不成立,则执行else
代码块。
-
- 多分支结构流程图:
- 示例:判断考试成绩等级
func main() { var score float64 fmt.Print("请输入成绩:") fmt.Scanf("%f", &score) if score >= 90 { fmt.Printf("%.2f分是A等", score) } else if score >= 80 { fmt.Printf("%.2f分是B等", score) } else if score >= 70 { fmt.Printf("%.2f分是C等", score) } else if score >= 60 { fmt.Printf("%.2f分是D等", score) } else { fmt.Printf("%.2f分是E等", score) } }
2.3.2 switch 语句
-
switch
语句的作用类似于if
语句,用于基于不同条件执行不同动作,每一个case
分支都是唯一的,从上至下逐一测试,直到匹配为止。 -
Go
语言的switch
语句不同于其他语言的switch
语句,Go
语言的switch
语句的表达式不需要为常量,且匹配项后面也不需要再加break
语句,case
语句最后自带break
语句。 -
switch
默认情况下case
最后自带break
语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。 -
Go
编程语言中switch
语句的语法如下:switch var1 { case val2: ... case val3: ... ...... case valN: ... default: ... }
-
switch
:判断使用的关键字。 -
var1
:需要判断的变量或条件表达式。 -
case
:每一个分支前面需要使用的关键字。 -
var2
:判断var1
是否满足var2
的条件。 -
varN
:判断var1
是否满足varN
的条件。 -
default
:如果var1
不满足上述所有的case
,则会执行default
分支。 -
注:变量
var1
可以是任何数据类型,而val1
和val2
则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型,或者最终结果为相同类型的表达式。
-
- 可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:
case val1, val2, val3
。func main() { // 请用户输入年份,再输入月份,输出该月的天数(需要考虑闰年) var year int var month int fmt.Print("请输入年份:") fmt.Scanf("%d\n", &year) fmt.Print("请输入月份:") fmt.Scanf("%d\n", &month) switch month { case 1, 3, 5, 7, 8, 10, 12: fmt.Printf("%d年%d月有31天", year, month) case 4, 6, 9, 11: fmt.Printf("%d年%d月有30天", year, month) case 2: if year%400 == 0 || year%4 == 0 && year%100 != 0 { fmt.Printf("%d年%d月有29天", year, month) } else { fmt.Printf("%d年%d月有28天", year, month) } default: fmt.Printf("%d年%d月不是一个正确的年月", year, month) } }
-
switch
语句流程图:
- 使用
fallthrough
会强制执行后面的case
语句,fallthrough
不会判断下一条case
的表达式结果是否为true
。func main() { // 请用户输入年份,再输入月份,输出该月的天数(需要考虑闰年) var year int var month int fmt.Print("请输入年份:") fmt.Scanf("%d\n", &year) fmt.Print("请输入月份:") fmt.Scanf("%d\n", &month) switch month { case 1,3,5,7,8,10,12: fmt.Printf("%d年%d月有31天", year, month) case 4: fallthrough case 6: fallthrough case 9: fallthrough case 11: fmt.Printf("%d年%d月有30天", year, month) case 2: if year%400 == 0 || year%4 == 0 && year%100 != 0 { fmt.Printf("%d年%d月有29天", year, month) } else { fmt.Printf("%d年%d月有28天", year, month) } default: fmt.Printf("%d年%d月不是一个正确的年月", year, month) } }