流程控制
前言
常见如判断语句、循环语句、break
和continue
条件结构
if判断
go语言中if
语句的基本语法如下:
if 条件1 {
满足条件1要执行的语句
} else if 条件2 {
满足条件2要执行的语句
} else {
条件都不满足时要执行的语句
}
- 示例代码:
package main
import "fmt"
func approve(days int) string {
if days > 3 {
return "总经理审批"
} else { // else不能换行
return "HR审批"
}
}
func main() {
days := 3
ret := approve(days)
fmt.Printf("请假%d天,需要%s\n",days,ret)
days = 5
ret = approve(days)
fmt.Printf("请假%d天,需要%s\n",days,ret)
}
- go语言中
if
语句的条件判断不用写括号- 大括号必须放置在
if
或else
之后。
switch判断
switch的基本语法如下:
switch 表达式 {
case 目标值1:
处理1
case 目标值2:
处理2
default:
默认处理
}
- 示例代码:
package main
import "fmt"
func getSex(code int) string {
switch code {
case 1:
return "男"
case 2:
return "女"
default:
return "未知"
}
}
func main() {
var code int = 1
ret := getSex(code)
fmt.Printf("%d -> %s \n",code,ret)
code = 0
ret = getSex(code)
fmt.Printf("%d -> %s \n",code,ret)
}
将匹配率高的case分支放在最上面,这样从概率上来讲可以更早地完成匹配并更快执行。
在switch
语句中,一旦匹配就不会再执行其它case
。如果有继续执行其它case
语句的需要,可以使用fallthrough
关键字进行穿透。遇到fallthrough
会直接穿透到下一层的case
分支处理语句,不管是否匹配。 示例:
package main
import "fmt"
func getSex(code int) string {
ret := ""
switch code {
case 1:
ret += "男"
fallthrough
case 0:
ret += "女"
fallthrough
default:
ret += "未知"
}
return ret
}
func main() {
var code int = 1
ret := getSex(code)
fmt.Printf("%d -> %s \n",code,ret) // 1 -> 男女未知
code = 0
ret = getSex(code)
fmt.Printf("%d -> %s \n",code,ret) // 0 -> 女未知
}
case
后面可以带多个表达式,使用逗号间隔。例如:case 1,2,3: { ... }
循环结构
在go语句中,循环方式只有for
,没有while
、do while
等。
for
循环基本语法:
// 标准语法
for 给循环变量赋初值的表达式;循环条件表达式;循环变量自增或自减少的表达式 {
循环体内要执行的语句
}
// 类while
for 循环条件表达式 {
循环体内要执行的语句
}
// 无限循环
for {
循环体内要执行的语句
}
示例代码:
package main
import (
"fmt"
)
func main() {
for i:= 0; i < 10; i++ {
fmt.Printf("%d\n", i)
}
fmt.Println("===============")
j := 10
for j > 0 {
fmt.Printf("--%d\n",j)
j--
}
fmt.Println("===============")
s := 10
for {
if s == 0 {
// 通过 goto 自由跳转而不受语句原来顺序的影响,从而跳出死循环
goto label
}
s--
fmt.Printf("%d\n",s)
}
label:
fmt.Printf("%d\n",j)
}
break和continue
break
:跳出循环,并退出所在的循环体continue
:中断当前的迭代,继续循环下一个迭 代,但是不退出所在的循环体
range关键字
range
关键字可以迭代数组、切片和字典等数据结构。在数组和切片中它返回元素的索引和索引对应的值。
示例
func main() {
arr1 := [3]int{1,2,3}
for index,v := range arr1 {
fmt.Println("arr[%d] -> %d", index, v)
}
}
其它
range
迭代元素时,本质上不是迭代每个元素,而是for range
创建的一个临时变量,其值是每次迭代元素的副本。
slice := [5]int{1,3,5,7,9}
for _,value := range slice {
fmt.Println(value) // 正常依次显示数值
fmt.Println(&value) // 但内存地址都是一样的
}