go的流程控制分别有
1,条件语句if/else
2,循环语句
1),for循环
2),continue与break区别
3),for-range
4),goto循环控制语句
3,选择语句switch/case
条件语句

Go 提供了我们熟悉的 if/else 语句的if,if-else,if-**else if**-else 变体。它用于检查条件,并在条件为 true 或 false 时执行一些代码。
if 语句 if 语句 由一个布尔表达式后紧跟一个或多个语句组成
• 可省略条件表达式括号。
• 持初始化语句,可定义代码块局部变量。
• 代码块左 括号必须在条件表达式尾部。
if 布尔表达式 {/* 在布尔表达式为 true 时执行 */}
package mainimport "fmt"func main() {five_m_go := true//基本if five_m_go {fmt.Println("there is five-m-go")}//if-else,if-else ifif five_m_go == false {fmt.Println("nothing")} else if five_m_go {fmt.Println("you get the five_m_go")} else {fmt.Println("other case")}// if条件可以包含一个初始化表达式,这个表达式中的变量// 是这个条件判断结构的局部变量if learn_time := 5; learn_time > 5 {fmt.Println("you study time is less than 5 m,just:", learn_time)} else if learn_time == 5 {fmt.Println("just enough 5 m")} else {fmt.Println("you study time is more than 5 m,is:", learn_time)}}
运行结果
-> % go run if-go.gothere is five-m-goyou get the five_m_gojust enough 5 m(base)
循环语句

for 循环
for循环是Go语言唯一的循环结构。但是 Go 的 for 循环有很多个变体,来针对不通的业务场景。
package mainimport "fmt"func main() {//基本learn_time := 1for learn_time <= 5 {fmt.Printf("you need more time to learn,now: %d m\n", learn_time)learn_time += 1}//经典的循环条件初始化/条件判断/循环后条件变化learn_time = 5for your_time := 1; your_time <= learn_time; your_time++ {fmt.Printf("your_time:%d m\n", your_time)}// 无条件的for循环是死循环,除非你使用break跳出循环或者// 使用return从函数返回your_loop := 1for {if your_loop == 6 {break} else {fmt.Println("now: ", your_loop)}your_loop++}}
运行结果
-> % go run loop_go.goyou need more time to learn,now: 1 myou need more time to learn,now: 2 myou need more time to learn,now: 3 myou need more time to learn,now: 4 myou need more time to learn,now: 5 myour_time:1 myour_time:2 myour_time:3 myour_time:4 myour_time:5 mnow: 1now: 2now: 3now: 4now: 5
continue与break区别
break 用于跳出循环,当条件满足则结束循环continue 用于跳过循环,当条件满足这跳过本次循环进行后置或条件子语句执行
package mainimport "fmt"func main() {for i := 1; i <= 6; i++ {if i == 2 {continue}fmt.Println("now: ", i)}//breakfor i := 1; i <= 6; i++ {if i == 2 {break}fmt.Println("now: ", i)}}
for-range
Golang range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
针对包含 Unicode 字符的字符串遍历是需要使用 for-range,range 返回两个元素分别为字 节索引和 rune 字符,可通过空白标识符忽略需要接收的变量
package mainimport "fmt"func main() {msg := "learn go in five m,一起来学go"for k, v := range msg {fmt.Printf("k:%d , v: %c\n", k, v)}}
运行结果
-> % go run loop_go.gok:0 , v: lk:1 , v: ek:2 , v: ak:3 , v: rk:4 , v: nk:5 , v:k:6 , v: gk:7 , v: ok:8 , v:k:9 , v: ik:10 , v: nk:11 , v:k:12 , v: fk:13 , v: ik:14 , v: vk:15 , v: ek:16 , v:k:17 , v: mk:18 , v: ,k:19 , v: 一k:22 , v: 起k:25 , v: 来k:28 , v: 学k:31 , v: gk:32 , v: o
goto循环控制语句
可以通过 goto 语句任意跳转到当前函数指定的 label 位置
break 和 continue 后也可以指定 label 用于指定跳出或跳过指定 label 同层级的循环
package mainimport "fmt"func main() {//使用标签完成for循环your_time := 1your_loop := 1START: //定义START标签if your_time > 4 {goto END //跳转到END标签} else {your_loop += your_timeyour_time++goto START}END:fmt.Println(your_loop)}
运行结果
-> % go run loop_go.go11
选择语句
当条件判断分支太多的时候,我们会使用switch语句来优化逻辑。
package mainimport "fmt"func main() {your_time := 5fmt.Print("your time is :", your_time, " as :")switch your_time {case 1:fmt.Println("one")case 2:fmt.Println("two")case 5:fmt.Println("five")}// 你可以使用逗号来在case中分开多个条件。还可以使用default语句,// 当上面的case都没有满足的时候执行default所指定的逻辑块。your_time2 := 5fmt.Print("your time is :", your_time2, " as :")switch your_time2 {case 1, 3:fmt.Println("one")case 2:fmt.Println("two")default:fmt.Println("is default")}// 当switch没有跟表达式的时候,功能和if/else相同,这里我们// 还可以看到case后面的表达式不一定是常量。your_time3 := 5fmt.Print("your time is :", your_time3, " as :")switch {case your_time3 < 5:fmt.Println("less than 5")default:fmt.Println("is default 5")}}
运行结果
-> % go run loop_go.goyour time is :5 as :fiveyour time is :5 as :is defaultyour time is :5 as :is default 5