# 2.7、Golang 流程控制 - 顺序执行 - 选择执行 - 循环执行 ## 顺序执行 示例 ```go package main import ( "fmt" ) func main() { fmt.Println("第一步") fmt.Println("第二步") } // 第一步 // 第二步 ``` ## 选择执行 ### if...else 语法 ```go if 条件 { } else{ } // 多重判断 if 条件1 { } else if 条件2 { } else{ } // 嵌套 if 条件1 { if 条件2 { } } ``` 示例 ```go package main import ( "fmt" ) func main() { a := 1 // 布尔表达式不需要括号 if a > 10 { fmt.Println("a > 10") } else { fmt.Println("a <= 10") } // a <= 10 } ``` Golang 中的特殊写法 ```go package main import ( "fmt" ) func main() { // age处于局部作用域 if age := 18; age > 18 { fmt.Println("age > 18") } else { fmt.Println("age <= 18") } // age <= 18 } ``` 接收用户输入 ```go package main import ( "fmt" ) func main() { var age int fmt.Printf("请输入age:\n") fmt.Scan(&age) fmt.Printf("age: %v\n", age) } ``` 命令行方式运行 ```bash $ go run main.go 请输入age: 23 age: 23 ``` ### switch...case 语法 ```go switch a { // 单值判断 case 0: fmt.Println("a = 0") // 可以是多个值,逗号隔开 case 1, 2, 3: fmt.Println("a = 1, 2, 3") // 表达式 case a <= 10: fmt.Println("a > 10") // 向下执行 case a > 10: fmt.Println("a > 10") fallthrough case a > 20: fmt.Println("a > 10") default: fmt.Println("default") } ``` 示例 ```go package main import ( "fmt" ) func main() { a := 1 switch a { case 0: fmt.Println("a = 0") case 1: fmt.Println("a = 1") default: fmt.Println("default") } // a = 1 } ``` > 注意:不能使用 0 和非 0 表示真假 ## 循环执行 ### for 语法 ```go for 初始语句; 条件表达式; 结束语句{ 循环体 } ``` 示例 ```go package main import ( "fmt" ) func main() { // for循环不加括号 for i := 0; i < 5; i++ { fmt.Printf("%v ", i) } // 0 1 2 3 4 // 初始条件写在for外边 i := 0 for ; i < 5; i++ { fmt.Printf("%v ", i) } // 只写判断条件 i := 0 for i < 5 { fmt.Printf("%v ", i) i++ } // 永真循环 for { } } ``` ### for...range for...range 遍历数组、切片、字符串、map 及通道(channel) 返回值: - 数组、切片、字符串:返回索引和值 - map:返回键和值 - 通道(channel):只返回通道内的值 示例 ```go package main import "fmt" func main() { list := []int{1, 2, 3} for index, value := range list { fmt.Printf("%v=%v ", index, value) } // 0=1 1=2 2=3 } ``` 遍历 map ```go package main import "fmt" func main() { m := make(map[string]string) m["name"] = "Tom" m["age"] = "28" for key, value := range m { fmt.Printf("%v=%v", key, value) } // name=Tomage=28 } ``` ### 关键字 - break - continue - goto #### break break 结束 for switch select 的代码块 break 注意事项 - 单独在 select 中使用 break,和不使用 break 没区别 - 单独在表达式 switch 语句,并且没有 falllthough,使用 break 和不使用 break 没区别 - 单独在表达式 switch 语句,并且有 falllthough,使用 break 能够终止 fallthough 后面的 case 语句 - 带标签的 break,可以跳出多层 select/switch 作用域,让 break 更加灵活,写法更加简单灵活,不需要使用控制变量一层一层跳出循环,没有带 break 的只能跳出当前语句块 示例 for ```go package main import "fmt" func main() { for i := 0; i < 10; i++ { if i >= 3 { break } fmt.Printf("%v\t", i) } // 0 1 2 } ``` switch ```go package main import "fmt" func main() { i := 1 switch i { case 1: fmt.Println("1") fallthrough case 2: fmt.Println("2") // break case 3: fmt.Println("3") // break } } ``` 标签 ```go package main import "fmt" func main() { LABEL: for i := 0; i < 10; i++ { fmt.Printf("%v ", i) if i >= 3 { break LABEL } } fmt.Println("end") } // 0 1 2 3 end ``` #### continue 只能用在 for 循环,终止本次循环,进行下次循环 ```go package main import "fmt" func main() { for i := 0; i < 10; i++ { if i%2 == 0 { continue } else { fmt.Printf("%v ", i) } } // 1 3 5 7 9 } ``` #### goto 通过标签进行代码之间的无条件跳转 ```go package main import "fmt" func main() { goto LABEL fmt.Println("label") LABEL: fmt.Println("end") } // end ```