流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”
Go 语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。

1. if else(分支结构)

推荐if后面不适用括号,当然也可以使用括号括起来

  1. func main() {
  2. var num = 10
  3. if num == 10 {
  4. fmt.Println("hello == 10")
  5. } else if(num > 10) {
  6. fmt.Println("hello > 10")
  7. } else {
  8. fmt.Println("hello < 10")
  9. }
  10. }

if的另外一种写法,下面的方法的区别是 num2是局部变量

  1. if num2:= 10; num2>=10 {
  2. fmt.Println("hello >=10")
  3. }

2. for 循环结构

Go语言中的所有循环类型均可使用for关键字来完成
for循环的基本格式如下:

  1. for 初始语句; 条件表达式; 结束语句 {
  2. 循环体
  3. }

条件表达式返回true时循环体不停地进行循环,直到条件表达式返回false时自动退出循环
实例:打印1 ~ 10

  1. for i := 0; i < 10; i++ {
  2. fmt.Printf("%v ", i+1)
  3. }

无限循环

注意,在Go语言中,没有while语句,我们可以通过for来代替

  1. for {
  2. 循环体
  3. }

for循环可以通过break、goto、return、panic语句退出循环

3. for range(键值循环)

Go 语言中可以使用for range遍历数组、切片、字符串、map及通道(channel)。通过for range遍历的返回值有以下规律:

  • 数组、切片、字符串返回索引和值。
  • map返回键和值。
  • 通道(channel)只返回通道内的值。

实例:遍历字符串

  1. var str = "你好golang"
  2. for key, value := range str {
  3. fmt.Printf("%v - %c ", key, value)
  4. }

遍历切片(数组)

  1. var array = []string{"php", "java", "node", "golang"}
  2. for index, value := range array {
  3. fmt.Printf("%v %s ", index, value)
  4. }

4. switch case(选择语句)

使用switch语句可方便的对大量的值进行条件判断

  1. extname := ".a"
  2. switch extname {
  3. case ".html": {
  4. fmt.Println(".html")
  5. break
  6. }
  7. case ".doc": {
  8. fmt.Println(".doc")
  9. break
  10. }
  11. case ".js": {
  12. fmt.Println(".js")
  13. }
  14. default: {
  15. fmt.Println("其它后缀")
  16. }
  17. }

Go语言规定每个switch只能有一个default分支。

一个分支可以有多个值,多个case值中间使用英文逗号分隔。
switch的另外一种写法

  1. switch extname := ".a"; extname {
  2. case ".html": {
  3. fmt.Println(".html")
  4. break
  5. }
  6. case ".doc": {
  7. fmt.Println(".doc")
  8. break
  9. }
  10. case ".js": {
  11. fmt.Println(".js")
  12. }
  13. default: {
  14. fmt.Println("其它后缀")
  15. }
  16. }

同时一个分支可以有多个值

  1. extname := ".txt"
  2. switch extname {
  3. case ".html": {
  4. fmt.Println(".html")
  5. break
  6. }
  7. case ".txt",".doc": {
  8. fmt.Println("传递来的是文档")
  9. break
  10. }
  11. case ".js": {
  12. fmt.Println(".js")
  13. }
  14. default: {
  15. fmt.Println("其它后缀")
  16. }
  17. }

tip:在golang中,break可以不写,也能够跳出case,而不会执行其它的。

如果我们需要使用switch的穿透fallthroughtfallthrough语法可以执行满足条件的 case 的下一个case,为了兼容c语言中的case设计

  1. extname := ".txt"
  2. switch extname {
  3. case ".html": {
  4. fmt.Println(".html")
  5. fallthrought
  6. }
  7. case ".txt",".doc": {
  8. fmt.Println("传递来的是文档")
  9. fallthrought
  10. }
  11. case ".js": {
  12. fmt.Println(".js")
  13. fallthrought
  14. }
  15. default: {
  16. fmt.Println("其它后缀")
  17. }
  18. }

fallthrought 只能穿透紧挨着的一层,不会一直穿透,但是如果每一层都写的话,就会导致每一层都进行穿透

5. break:跳出循环

Go语言中break 语句用于以下几个方面:

  • 用于循环语句中跳出循环,并开始执行循环之后的语句。
  • break在switch(开关语句)中在执行一条case后跳出语句的作用。
  • 在多重循环中,可以用标号label标出想break的循环。

break语句可以结束forswitchselect的代码块。
break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的forswitchselect的代码块上。

  1. var i = 0
  2. for {
  3. if i == 10{
  4. fmt.Println("跳出循环")
  5. break
  6. }
  7. i++
  8. fmt.Println(i)
  9. }

6. go:跳转到指定标签

goto 语句通过标签进行代码间的无条件跳转。goto 语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用goto语句能简化一些代码的实现过程。

  1. var n = 20
  2. if n > 24 {
  3. fmt.Println("成年人")
  4. } else {
  5. goto lable3
  6. }
  7. fmt.Println("aaa")
  8. fmt.Println("bbb")
  9. lable3:
  10. fmt.Println("ccc")
  11. fmt.Println("ddd")

7. continue : 继续下次循环

continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用。


在 continue语句后添加标签时,表示开始标签对应的循环。例如:

  1. func continueDemo() {
  2. forloop1:
  3. for i := 0; i < 5; i++ {
  4. // forloop2:
  5. for j := 0; j < 5; j++ {
  6. if i == 2 && j == 2 {
  7. continue forloop1
  8. }
  9. fmt.Printf("%v-%v\n", i, j)
  10. }
  11. }
  12. }