跳到主要内容

流程控制

前言

常见如判断语句、循环语句、breakcontinue

条件结构

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语句的条件判断不用写括号
  • 大括号必须放置在ifelse之后。

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,没有whiledo 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) // 但内存地址都是一样的
}