流程控制
所有程序中一般都有三大流程控制语句:
- 顺序控制
- 分支控制
- 循环控制
顺序控制
顺序控制表示程序从上到下逐行执行,中间没有任何判断和跳转
分支控制
if
if else 用于分支控制,一般有单分支、双分支、多分支、嵌套分支,由于太简单了,这里只列一下各自的表现形式好了
- 单分支
if 条件表达式 {
...
}
- 双分支
if 条件表达式 {
...
} else {
...
}
- 多分支
if 条件表达式1 {
...
} else if 条件表达式2 {
...
}
...
else {
...
}
- 嵌套分支
嵌套分支层数不宜过多
if 条件表达式 {
if 条件表达式 {
...
} else {
...
}
}
注意事项
- 无论嵌套多少层分支,都只会执行其中一个分支
- else 不是必须的
switch
switch 表达式 {
case 表达式1,表达式2,...:
...
case 表达式n:
...
...
default:
...
}
- 每一个 case 都是唯一的
- 每一个case 不需要加 break(类比 Java 8 [滑稽])
- default 语句不是必须的
- switch 后面也可以不带表达式,类似上面
if
多分支 - switch-fallthrough(switch 穿透,以后用到再补充)
- Type Switch:用来判断某个 interface 变量中实际指向的变量类型(类似 Java 中的
instanceof
,以后用到再补充)
循环控制
for
- 第一种写法:
for i := 0; i < 10; i++ {
...
}
- 第二种写法:
j := 1
for j <= 10 {
...
j++
}
- 第三种写法:
k := 1
for {
if k <= 10 {
...
} else {
break
}
k++
}
- 第四种写法:
for-range
,可以方便遍历字符串和数组
for-range 在遍历字符串的时候,是按照字符来遍历的,而不是按照字节来遍历的。而普通的 for 循环遍历是按照字节来遍历的,如果含有中文,就会报错(需要将字符串转成
[]rune
数组再遍历,即可解决)。
str := "hello worlds! 你好"
for idx, val := range str {
fmt.Printf("index=%d val=%c", idx, val)
}
while 和 do-while
Golang 中没有这两个控制语句,可以使用 for + if 来实现类似功能
// while:
i := 1
for {
if i > 10 {
break
}
...
i++
}
// do...while
j := 1
for {
...
j++
if j > 10 {
break
}
}
跳转控制语句
break
break 用于终止某个语句块的执行,用于中断当前 for 循环或跳出 switch 语句。break 可以搭配 label 使用,常用于跳出多层循环。
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
break
}
fmt.Println("j=", j)
}
}
}
上面代码中,只有一个 break
,默认跳出的是第一个 for 循环
func main() {
top:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
break top
}
fmt.Println("j=", j)
}
}
}
给需要跳出的循环加一个 label,就可以跳出指定的循环
continue
continue 用于结束本次循环,继续执行下一次循环。和 break 一样,continue 不加 label 时默认跳出到最近的 for 循环,继续执行下一个循环。如果加了 label,就会跳到对应 label 的 for 循环继续下一次循环。
goto
goto 可以无条件的转移到指定行去继续执行
func main() {
fmt.Println(1)
fmt.Println(2)
goto seven
fmt.Println(3)
fmt.Println(4)
fmt.Println(5)
fmt.Println(6)
seven:
fmt.Println(7)
fmt.Println(8)
fmt.Println(9)
}
# 输出
12789
return
跳出当前执行函数