4.流程控制
4.流程控制
4.1 if-else 语句
条件判断是由if语句实现,根据条件的结果true和false来执行相应的代码。其基本语法格式如下所示:
- 基本 if 语句
if condition-1 {
// do something
} else if condition-2 {
// do something
} else {
// do something
}
- 嵌套 if 语句
if condition-1 {
// do something
if condition-1-1 {
// do something
} else if condition-1-2 {
// do something
} else {
// do something
}
} else if condition-2 {
// do something
} else {
// do something
}
在使用 if 语句的注意事项如下所示:
- 每个条件语句后面必须紧跟
{} - 在 if 语句中,仅有一个
if和else关键字,但允许拥有多个else if,语句出现的顺序为if -> else if -> else - 一个简单的 if 语句,可以允许仅有一个 if 关键字
- 不推荐在 if 语句进行多层嵌套处理,这样会导致逻辑难以理解和代码冗余
示例代码如下所示:
package main
import "fmt"
func main() {
var score int
fmt.Print("请输入分数:")
fmt.Scan(&score)
if score >= 90 {
fmt.Printf("分数为%d,成绩非常棒", score)
} else if score >= 80 {
fmt.Printf("分数为%d,成绩良好", score)
} else if score >= 70 {
fmt.Printf("分数为%d,成绩中等", score)
} else if score >= 60 {
fmt.Printf("分数为%d,成绩合格", score)
} else if score < 60 {
fmt.Printf("分数为%d,成绩不合格", score)
}
}
在以上代码定义的score在main方法中属于全局变量,Go 语言中也支持在 if 语句中定义临时变量,作用域仅限于 if 语句内使用,示例代码如下所示:
package main
import (
"fmt"
"math/rand"
)
func main() {
if num := rand.Intn(100); num < 50 {
fmt.Printf("随机数%d < 50 成立", num)
} else if num > 20 {
fmt.Printf("随机数%d > 20 成立", num)
}
// 这里获取随机数%d会出现报错,超出作用域,报错信息: undefined: num
// fmt.Printf("这里获取随机数%d会出现报错,超出作用域", num)
}
4.2 switch 语句
多条件语句是由switch语句实现的,可以某个变量值进行条件选择并执行相应的代码,其基本语法格式如下所示:
- 第一种方式
switch 变量{
case 值-1:
执行语句-1
fallthrough
case 值-2:
执行语句-2
default:
执行语句-n
}
- 第二种方式
switch {
case 变量的条件判断-1:
执行语句-1
case 变量的条件判断-2:
执行语句-2
fallthrough
default:
执行语句-n
}
- 第三种方式
switch 定义变量;变量{
case 值-1:
执行语句-1
fallthrough
case 值-2:
执行语句-2
default:
执行语句-n
}
在使用 switch 语句时,注意事项如下所示:
- 关键字 switch 后面可根据需要决定是否设置变量,且末端需要添加{}
- 一个 switch 语句中可以包含多个关键字 case,但只有一个关键字 default
- 关键字 case 是设置变量的判断条件,若符合条件,则执行对应的语句,
执行完毕后直接跳出整个switch语句,不再往下执行 - 程序在执行 switch 语句时,case 语句是
从上往下按顺序执行 - 当程序执行了某个 case 语句之后,若还想继续执行
下一个case语句,可以使用关键字fallthrough继续执行后续的 case
示例代码如下所示:
package main
import (
"fmt"
"math/rand"
)
func main() {
// 第一种方式
randomNum := rand.Intn(40)
switch randomNum {
case 10:
fmt.Printf("随机数为10,成立\n")
fallthrough
case 20:
fmt.Printf("随机数为20,成立\n")
case 50:
fmt.Printf("随机数为50,成立\n")
default:
fmt.Printf("以上条件均不成立,生成的随机数为:%d\n", randomNum)
}
// 第二种方式
switch {
case randomNum < 10:
fmt.Printf("随机数为:%d < 10,成立\n", randomNum)
case randomNum < 20:
fmt.Printf("随机数为:%d < 20,成立\n", randomNum)
case randomNum < 50:
fmt.Printf("随机数为:%d < 50,成立\n", randomNum)
fallthrough
default:
fmt.Printf("以上条件均不成立,生成的随机数为:%d\n", randomNum)
}
// 第三种方式
switch randomNum2 := rand.Intn(10); randomNum2 {
case 1, 3, 5, 7, 9:
fmt.Printf("生成的随机数为奇数,值为:%d\n", randomNum2)
fallthrough
case 0, 2, 4, 6, 8:
fmt.Printf("生成的随机数为偶数,值为:%d\n", randomNum2)
default:
fmt.Printf("不知道是哪一类数字\n")
}
}
运行结果如下所示:
以上条件均不成立,生成的随机数为:27
随机数为:27 < 50,成立
以上条件均不成立,生成的随机数为:27
生成的随机数为奇数,值为:5
生成的随机数为偶数,值为:5
4.3 for 语句
4.3.1 基本 for 语句
Go 语言的循环语句仅支持for语句,不支持while和do-while语法。for 循环可对可迭代变量进行遍历输出。可迭代变量一般是指字符串、数组、切片、通道等类型的数据。其基本语法如下所示:
for 变量初始值;判断条件;变量控制 {
循环体语句
}
for 关键字后参数说明:
- 变量初始值:一般为赋值表达式,定义变量或给变量设置初始值
- 判断条件:一般为关系表达式或逻辑表达式,用于控制循环是否继续循环,为 true 则继续循环
- 变量控制:一般为赋值表达式,对变量进行递增或递减等
在实际使用,以上三个参数都是可选项,可根据实际需要灵活变换,常见的组合方式如下所示:
// 基本型
for 变量初始值;判断条件;变量控制 {
循环体语句
}
for 变量初始值;判断条件; {
循环体语句
}
for 判断条件 {
循环体语句
}
for {
循环体语句
}
在使用 for 的各种组合,需要注意避免死循环
示例代码如下所示:
package main
import "fmt"
func main() {
// 基本型
for i := 0; i < 5; i++ {
fmt.Printf(" %d", i)
}
fmt.Println()
// 组合方式二
for i := 0; i < 5; {
fmt.Printf(" %d", i)
i++
}
fmt.Println()
// 组合方式三
i := 0
for i < 5 {
fmt.Printf(" %d", i)
i++
}
fmt.Println()
// 组合方式四
j := 0
for {
if j > 5 {
break
}
fmt.Printf(" %d", j)
j++
}
}
运行结果如下所示:
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4 5
4.3.2 for-range 语句
for 语句是通过设置循环变量来执行循环次数,如果要对可迭代变量的元素遍历输出,也可以使用for-range语句。其基本语法如下所示:
for index, value := range v {
循环语句
}
- index:代表当前可迭代对象的索引
- value: 代表当前可迭代对象的值
示例代码如下所示:
package main
import "fmt"
func main() {
// 定义一个数组
nameArray := [...]string{"Surpass", "Surmount", "Jack", "Herry"}
for index, value := range nameArray {
fmt.Printf("数组输出->当前索引为:%d,元素值为:%s\n", index, value)
}
fmt.Println()
// 定义一个切片
nameSlice := []string{"Surpass", "Surmount", "Jack", "Herry"}
for index, value := range nameSlice {
fmt.Printf("切片输出->当前索引为:%d,元素值为:%s\n", index, value)
}
fmt.Println()
// 忽略索引
ageSlice := []int{18, 28, 38, 88}
for _, value := range ageSlice {
fmt.Printf("切片输出忽略索引->元素值为:%d\n", value)
}
fmt.Println()
// 仅获取索引
for index := range ageSlice {
fmt.Printf("切片输出仅获取索引->元素索引为:%d\n", index)
}
fmt.Println()
}
运行结果如下所示:
数组输出->当前索引为:0,元素值为:Surpass
数组输出->当前索引为:1,元素值为:Surmount
数组输出->当前索引为:2,元素值为:Jack
数组输出->当前索引为:3,元素值为:Herry
切片输出->当前索引为:0,元素值为:Surpass
切片输出->当前索引为:1,元素值为:Surmount
切片输出->当前索引为:2,元素值为:Jack
切片输出->当前索引为:3,元素值为:Herry
切片输出忽略索引->元素值为:18
切片输出忽略索引->元素值为:28
切片输出忽略索引->元素值为:38
切片输出忽略索引->元素值为:88
切片输出仅获取索引->元素索引为:0
切片输出仅获取索引->元素索引为:1
切片输出仅获取索引->元素索引为:2
切片输出仅获取索引->元素索引为:3
4.4 中断语句
4.4.1 break 语句
当程序执行 switch 语句、select 语句、for 语句时,需要在特定条件下结束当前操作时,可以使用break实现结束当前操作。如果出现多层嵌套,还可以结束指定位置的循环。示例代码如下所示:
package main
import "fmt"
func main() {
// 基本使用,结束本次循环
for i := 0; i < 5; i++ {
fmt.Printf("当前值为:%d\n", i)
if i == 2 {
fmt.Println("遇见break,结束本次循环")
break
}
}
fmt.Println("~~~~~~~~~~~~~~")
// 未指定位置
for i := 0; i < 5; i++ {
for j := i; j < 5; j++ {
fmt.Printf("当前i值为:%d,j值为:%d\n", i, j)
if j == 2 {
fmt.Println("遇见break,结束本次循环")
break
}
}
}
fmt.Println("~~~~~~~~~~~~~~")
// 多层嵌套,结束指定循环
loop1:
for i := 0; i < 5; i++ {
for j := i; j < 5; j++ {
fmt.Printf("当前i值为:%d,j值为:%d\n", i, j)
if j == 2 {
fmt.Println("遇见break,结束本次循环")
// 这里添加loop1,可以直接结束最外层循环
break loop1
}
}
}
}
运行结果如下所示:
当前值为:0
当前值为:1
当前值为:2
遇见break,结束本次循环
~~~~~~~~~~~~~~
当前i值为:0,j值为:0
当前i值为:0,j值为:1
当前i值为:0,j值为:2
遇见break,结束本次循环
当前i值为:1,j值为:1
当前i值为:1,j值为:2
遇见break,结束本次循环
当前i值为:2,j值为:2
遇见break,结束本次循环
当前i值为:3,j值为:3
当前i值为:3,j值为:4
当前i值为:4,j值为:4
~~~~~~~~~~~~~~
当前i值为:0,j值为:0
当前i值为:0,j值为:1
当前i值为:0,j值为:2
遇见break,结束本次循环
在其他语言中,break 不支持越级结束循环,但在 Go 语言里面可以越级结束循环,只需要在特定循环前添加标签,在 break 语句后添加对应的标签即可
4.4.2 continue 语句
continue 语句只适用于 for 语句,其可以实现跳过本次循环进入下一次循环,示例代码如下所示:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
if i == 3 {
continue
}
fmt.Printf("当前值为:%d\n", i)
}
}
运行结果如下所示:
当前值为:0
当前值为:1
当前值为:2
当前值为:4
可以看出在 i=3 时,跳过本次循环,继续下一次循环输出
4.5 跳转语句
关键字goto语句可以通过标签在代码之间的无条件跳转,不仅可以快速跳出循环,也能简化重复性代码,其基本语法如下所示:
for 变量初始值;判断条件;变量控制 {
goto 标签名
}
标签名:
执行语句
关键字 goto 后面必须标签名,程序查找对应标签执行标签后面的代码。定义的标签名及代码必须在 goto 关键字后面,否则会出现死循环。以下为陷入死循环的代码,需要尽量避免。为避免 goto 引起的死循环问题,定义的标签及代码一般建议放置在程序的末端位置。以下代码会导致出现死循环,需要避免。
package main
import "fmt"
func main() {
loopA:
fmt.Println("跳转至goto语句")
for i := 0; i < 5; i++ {
if i == 3 {
goto loopA
}
fmt.Printf("当前值为:%d\n", i)
}
}
推荐的 goto 跳转示例代码如下所示:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
if i == 3 {
goto loopA
}
fmt.Printf("当前值为:%d\n", i)
}
// 为避免goto导致死循环,标签放置在代码末端
loopA:
fmt.Println("跳转至goto语句")
fmt.Println("程序结束")
}
运行结果如下所示:
当前值为:0
当前值为:1
当前值为:2
跳转至goto语句
程序结束
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

作者: Surpassme
来源: http://www.jianshu.com/u/28161b7c9995/
http://www.cnblogs.com/surpassme/
声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 ,否则保留追究法律责任的权利。如有问题,可发送邮件 联系。让我们尊重原创者版权,共同营造良好的IT朋友圈。

浙公网安备 33010602011771号