在Go语言中,总结后的流程控制语句主要有if
、for
、switch
、goto
。其中常用的为if
、for
。
接下来讲依次记录这几种流程控制,并以代码进行说明。
if流程控制
if条件语句的一般格式如示例所示:
/*
当第一个表达式为true时,执行第一个逻辑块,否则判断第二个表达式;第二个表达式为true时执行第二个逻辑块,
否则执行第三个逻辑块。
*/
if 表达式 {
逻辑块
} else if 表达式 {
逻辑块
} else {
逻辑块
}
注意:在Go中关于if
有个硬性规定,与if
匹配的{
必须和if与表达式
在同一行,{
放在其他位置在编译的时候会报错;与else
匹配的{
也必须写在同一行,并且else
与它对应的if
的}
也要在同一行。
示例:
func ifDemo() {
age := 25
if age >= 65 {
fmt.Println("美滋滋地退休生活...")
} else if age <= 18 {
fmt.Println("美滋滋的地学生生活...")
} else {
fmt.Println("苦逼的上班社畜0.0")
}
}
此外,if语句还可以在表达式之前写一个执行语句,用;
隔开,之后再根据条件进行判断真假
示例:
func ifDemo() {
if age := 25; age >= 65 {
fmt.Println("美滋滋地退休生活...")
} else if age <= 18 {
fmt.Println("美滋滋的地学生生活...")
} else {
fmt.Println("苦逼的上班社畜0.0")
}
}
这种在if
后面定义的变量,其作用域为整个if
流程,出了if
流程之后age
变量便失去了作用。
for控制流程
在Go中的控制循环实现用for
。
for循环的基本格式
如下示例:
for 初始语句;条件语句;结束语句 {
循环块语句
}
条件语句返回
true
时循环会一直进行下去,循环块会一直执行,直到条件语句返回false
时退出循环
变种1:在Go中for
循环的初始语句
可以忽略
示例:
func forDemo() {
i := 0
for ; i < 9; ++i {
fmt.Printf("%d ",i)
}
}
变种2:在Go中for
循环的初始语句
和结束语句
都可以忽略
示例:
func forDemo() {
i := 0
for ; i < 9; {
fmt.Printf("%d ",i)
i++
}
}
死循环:可以通过break
、goto
、return
、panic
强制退出循环来结束死循环
for 的键值循环
在Go中可以通过使用for range
来遍历数组、切片、字符串、map等。其中,在遍历数组、切片和字符串的时候,其遍历返回索引和值;在遍历map时返回键、值;在遍历channel时只返回通道值。
switch case控制流程
通过使用switch
+case
来对大量的if
语句进行简化代码,示例:
func switchDemo() {
age := 25
switch { //case使用表达式的时候在switch后不写变量
case age < 12:
fmt.Println("童年")
case age < 18:
fmt.Println("少年")
case age < 30:
fmt.Println("青年")
case age < 60:
fmt.Println("中年")
default: //default在一个switch中只能有一个
fmt.Println("老年")
}
}
注意:在Go中,匹配到case
后执行对应的语句块后会直接跳出switch
语句,不必写break
来跳出switch
流程。
变种1 :case
后可跟数字、字母,且switch
与case
的数据类型必须相同
示例:
func switchDemo() {
age := 2
switch age { //age与1、2、3、4都是相同的数据类型
case 1:
fmt.Println(1)
case 2:
fmt.Println(2)
case 3:
fmt.Println(3)
case 4:
fmt.Println(4)
default:
fmt.Println(5)
}
}
变种2 :通过使用fallthrough
来执行满足case
条件的下一个case
,示例:
func switchDemo() {
age := 25
switch {
case age < 12:
fmt.Println("童年")
case age < 18:
fmt.Println("少年")
case age < 30:
fmt.Println("青年")
fallthrough
case age < 60:
fmt.Println("中年")
default:
fmt.Println("老年")
}
}
会打印出"青年"跟"中年"两个字符串
goto控制流程
goto
语句通过标签在代码间的进行无条件跳转。比较有效的用于多层循环退出时,示例:
//双循环不使用goto时需要设置一个退出标签来跳出循环,多层时需要更多的标签
func gotoDemo1() {
var breakFlag bool
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 设置退出标签
breakFlag = true
break
}
fmt.Printf("%v-%v\n", i, j)
}
// 外层for循环判断
if breakFlag {
break
}
}
}
//使用goto直接跳出双循环
func gotoDemo2() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 设置退出标签
goto breakTag
}
fmt.Printf("%v-%v\n", i, j)
}
}
return
// 标签
breakTag:
fmt.Println("结束for循环")
}
break控制流程
break
语句可以结束for
、switch
、select
的代码块。示例:
//break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块
func breakDeme() {
//要求标签必须在对应的语句的代码块上
breakDemo:
for i:= 0; i < 10; i++ {
if i == 8 {
break breakDeme
}
fmt.Println(i)
}
fmt.Println("Demo is over...")
}
continue控制流程
continue
语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for
循环内使用。
func breakDeme() {
//在 continue语句后添加标签时,表示开始标签对应的循环。
continueDemo:
for i:= 0; i < 10; i++ {
if i == 8 {
continue continueDemo
}
fmt.Println(i)
}
fmt.Println("Demo is over...")
}