Golang 流程控制
- 条件语句
- if
- switch
select- 循环语句
- for 循环
- break、continue、
goto退出循环- for range 键值循环
条件语句 if
(1)基本写法
if 布尔表达式1 {
分支1
} else if 布尔表达式2 {
分支2
} else{
分支3
}
// 代码示例
func demo() {
score := 82
if score > 90 {
fmt.Println("A")
} else if score > 75 {
fmt.Println("B")
} else {
fmt.Println("C")
}
}
(2)特殊写法
if 语句,还有一种特殊的写法:可以在 if 表达式之前,添加一个执行语句,再根据变量值进行判断
func demo() { if score := 100; score > 90 { fmt.Println("A") } else if score > 75 { fmt.Println("B") } else { fmt.Println("C") } }
(3)注意事项
- 布尔表达式,不需使用括号 {} 将条件包含起来
- 大括号 {},必须存在,即使只有一行语句
- 左括号,必须在if或else的同一行
- if 之后,条件语句之前,可以添加变量初始化语句,使用 ; 进行分隔,其作用域仅限条件语句
条件语句 switch
Golang 中,使用 switch 可以用于判断多个值的情况
// 基本写法 switch var1 { case val1: ... // 不同的case之间不使用break分隔,默认只会执行一个case case val2: ... default: ... } // 代码示例 func f() { grade := "A" switch grade { case "A": fmt.Println("优秀") case "B": fmt.Println("良好") default: fmt.Println("一般") } }
- case 支持多条件匹配:即,可以同时匹配多个条件,中间用逗号分隔,有其中一个匹配成功即可
func f() { day := 3 switch day { case 1, 2, 3, 4, 5: fmt.Println("工作日") case 6, 7: fmt.Println("休息日") } }
- case 可以是条件表达式:即,分支可以使用表达式
func f() { score := 90 switch { case score >= 90: fmt.Println("享受假期") case score < 90 && score >= 80: fmt.Println("好好学习吧!") default: fmt.Println("玩命学习!") } }
- 可以使用 fallthrough,执行满足条件的下一个 case
func f3() { a := 100 switch a { case 100: fmt.Println("100") fallthrough case 200: fmt.Println("200") case 300: fmt.Println("300") default: fmt.Println("other") } }
for 循环语句
Golang 中,所有循环类型,都可以使用 for 关键字来完成
// 基本语法 - for 表达式不用加括号 for 初始语句;条件表达式;结束语句{ 循环体语句 } // 代码示例 func demo() { // 循环打印 1-10 for i := 1; i <= 10; i++ { fmt.Println(i) } }不同的使用方式:
// 初始条件,可以写到外面,但分号必须保留 func f() { i := 1 for ; i <= 10; i++ { fmt.Printf("i: %v\n", i) } } // 初始条件和结束条件都可以省略,类似于 where func f() { i := 1 // 初始条件 for i <= 10 { fmt.Printf("i: %v\n", i) i++ // 结束条件 } } // 无限循环 func f() { for { fmt.Println("我一直在执行~") } }
「 退出循环 break、continue、goto 」 for 循环,可以通过 break、goto、return、panic 语句,强制退出循环
(1)break 跳出循环
- break 语句,可以结束 for、switch 和 select 的代码块
func demo() { for i := 0; i < 10; i++ { if i == 3 { break } fmt.Println(i) // 0 1 2 } }
- 还可以,在语句后面添加标签,表示退出某个标签对应的代码块
// 标签要求必须定义在对应的for、switch和 select的代码块上 func demo() { BREAKDEMO: for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { break BREAKDEMO } fmt.Printf("%v-%v\n", i, j) } } fmt.Println("...") }
(2)continue 跳过当前循环
- continue 语句,可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用
func demo() { for i := 0; i < 10; i++ { if i == 3 { continue } fmt.Println(i) // 0 1 2 4 5 6 7 8 9 } }
- 在 continue 语句后,添加标签时,表示开始标签对应的循环
func demo() { forloop1: for i := 0; i < 5; i++ { // forloop2: for j := 0; j < 5; j++ { if i == 2 && j == 2 { continue forloop1 } fmt.Printf("%v-%v\n", i, j) } } }
(3)goto 跳转到指定标签
goto 语句,通过标签,进行代码间的无条件跳转,在快速跳出循环、避免重复退出上,能够简化一些代码的实现过程
func gotoDemo1() { var breakFlag bool for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { // 设置退出标签 breakFlag = true break } fmt.Printf("%v-%v\n", i, j) } // 外层for循环判断 if breakFlag { break } } } // 使用 goto 语句能够简化代码 func gotoDemo2() { for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { if j == 2 { // 设置退出标签 goto breakTag } fmt.Printf("%v-%v\n", i, j) } } return // 标签 breakTag: fmt.Println("结束for循环") }
键值( key - value )循环 for range
Golang 中,可以使用 for range 遍历 数组、slice、map 及 字符串 和 channel,其中:
- 数组、slice、字符串,返回索引和值
- map,返回键和值
- channel,只返回通道内的值
// 基本语法 - 快捷键:forr for key, value := range coll { ... } // 代码示例 - 循环数组 func demo() { arr := [...]int{ 1, 2, 3, 4, 5, } for i, v := range arr { fmt.Printf("i: %d, v: %v\n", i, v) } } // 代码示例 - 循环字符串 func demo() { str := "helloWorld" for i, v := range str { fmt.Printf("i: %d, v: %c\n", i, v) } } // 代码示例 - 循环切片 func demo() { arr := []int{ 1, 2, 3, 4, 5, } for _, v := range arr { fmt.Printf("v: %v\n", v) } } // 代码示例 - 循环 map func demo() { m := make(map[string]string) m["name"] = "小明" m["age"] = "20" for k, v := range m { fmt.Printf("k: %v,v:%v\n", k, v) } }