流程控制是编程语言非常重要的部分。一般在我们的业务代码中,if/else,for循环
等流程控制代码是使用频率非常高的。
golang中比较常用的流程控制有以下几种:if\else
、for循环
、for range迭代
、switch选择
、goto代码跳转
、break
、continue
1、if\else(分支结构)
golang中使用if\else
来做条件判断。
基本语法
if 表达式1 {
分支结构2
} else if 表达式2 {
分支结构2
} else {
分支结构3
}
这是if\else
语句的基本格式。每个条件表达式的值必须为布尔(bool)
型,程序从上往下走,当表达式的值为true
,则执行该分支中的代码,该分支中执行完后,则跳出if\else
,后续分支结构不在判断和执行。当表达式的值为false
时,则跳过当前分支,往下继续判断,直到某个分支表达式为true
或者走到else
分支,然后执行该分支中代码,结束流程。
简单示例
func main() {
scope := 90
if scope > 90 {
fmt.Println("scope > 90")
} else if scope < 80 {
fmt.Println("scope < 80")
} else {
fmt.Println("scope = 90")
}
}
// 打印scope = 90
if条件判断的特殊写法
if语句后面还可以带一条简单的初始化语句,该语句声明的变量的作用域是整个if\else
流程。
func main() {
if scope := 90 ; scope > 90 {
fmt.Println("scope > 90")
} else if scope < 80 {
fmt.Println("scope < 80")
} else {
fmt.Println("scope = 90")
}
}
// 打印scope = 90
2、for循环
golang中for
用来循环执行语句。
基本语法
for 初始语句; 条件表达式; 结束语句 {
循环语句
}
初始语句一般用来定义条件表达式中所需要的变量。条件表达式是循环是否执行的判断依据,条件表达式为true
时则执行不断循环语句,条件为false
时则退出循环。结束语句是执行一次循环后做的操作。
简单示例
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}
// 换行打印 1 2 3 4 5
for循环的初始语句可以被省略,但是后面的;
不能省略
简单示例
func main() {
i := 0
for ; i < 5; i++ {
fmt.Println(i)
}
}
for循环的初始语句和结束语句都可以被省略,并且初始语句和条件表达式后的;
也可以被省略。这样就类型与java
中的while
循环
简单示例
func main() {
i := 0
for i < 5 {
fmt.Println(i)
i++
}
}
如果不给for循环设置条件表达式,则for循环为无限循环
简单示例
func main() {
for {
fmt.Println("无限循环")
}
}
3、for range迭代循环
for range
是golang中的迭代循环结构,用来迭代遍历任何一种集合(数组、切片等),也可以遍历字符串。
基本语法
for i, val := range 集合 {
}
for range
迭代每次会返回一个或两个值,每个返回值的含义不是固定的,迭代不同的类型集合,返回值的意义各不相同。
- 迭代字符串,数组,切片:第一个返回值为索引,第二个返回值为对应的值
- 迭代map:第一个返回值为key,第二个返回值为value
- 迭代通道:只返回一个值,为通道内的值
注意事项
for range
迭代返回的val
是集合中值的拷贝副本,对它的修改不会影响到集合中的值。
4、switch选择结构
基本语法
switch value {
case var1:
...
case var2, var3:
...
default:
...
}
变量value
可以为任意一种类型,而var1,var2,var3
必须是相同类型的值。每个case分支必须是唯一,当某个分支成功匹配后,执行相应代码,然后跳出整个switch
语句块。若case
分支均不匹配,则执行default
分支代码。当然如果我们想在分支匹配后继续执行switch
语句块,则可以使用关键字fallthrough
,匹配分支后的每个case分支(default分支不会执行)都会执行一遍。
简单示例
func main() {
var s int32 = 10
switch s {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
case 10:
fmt.Println("10")
fallthrough
case 11:
fmt.Println("11")
default:
fmt.Println("default")
}
}
// 10 11
5、break和continue
break
关键字用来跳出当前循环(只能跳出一层)或者跳出整个switch
语句块。
简单示例
func main() {
func main() {
var s int32 = 10
switch s {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
case 10:
fmt.Println("10")
fallthrough
case 11:
fmt.Println("11")
break
case 12:
fmt.Println("12")
default:
fmt.Println("default")
}
// 10 11
for i := 0; i < 3; i++ {
for j := 0; j < 10; j++ {
if j > 5 {
break
}
print(j)
}
print(" ")
}
// 012345 012345 012345
}
continue
关键字用来忽略当前剩余的循环语句(或者说本次循环剩余的语句不继续执行),进入下一次循环。
简单示例
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
print(i)
print(" ")
}
}
6、goto
goto
是跳转语句,通常它与标签结合使用。goto 标签
,这样就是程序跳转到标签的位置。
简单示例
func main() {
goto flag
fmt.Println("B")
flag:
fmt.Println("A")
}
// 打印 A
需要注意的是,goto与标签之间不能定义新的变量,否则编译通过不了。还有goto这东西能不用就不要用,使用goto使代码的可读性和可维护性变差。记得当初某次课设时,老师直接说了,谁用goto直接挂。