datetime:2020/9/16 11:41
author:nzb

Go的流程控制

流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉"

Go 语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。

1、条件语句

1.1、if else

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

    if 布尔表达式 {
       /* 在布尔表达式为 true 时执行 */
    } else {
      /* 在布尔表达式为 false 时执行 */
    }
    func main() {
        var num = 10
        if num == 10 {
            fmt.Println("hello == 10")
        } else if(num > 10) {
            fmt.Println("hello > 10")
        } else {
            fmt.Println("hello < 10")
        }
    }

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

    if num2:= 10; num2>=10 {
        fmt.Println("hello >=10")
        fmt.Println(num2)            // 可打印
    }
    fmt.Println(num2)            // 报错,因为 num2 是局部变量

if 语句嵌套

    if 布尔表达式 1 {
       /* 在布尔表达式 1 为 true 时执行 */
       if 布尔表达式 2 {
          /* 在布尔表达式 2 为 true 时执行 */
       }
    }

你可以以同样的方式在 if 语句中嵌套 else if...else 语句

1、if 后的 大括号 {}不能省略

2、{必须紧挨着条件

1.2、switch case

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

switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。

    switch var1 {
        case val1:
            ...
        case val2:
            ...
        default:
            ...
    }
    extname := ".a"
    switch extname {
        case ".html": {
            fmt.Println(".html")
            break
        }
        case ".doc": {
            fmt.Println(".doc")
            break
        }
        case ".js": {
            fmt.Println(".js")
        }
        default: {
            fmt.Println("其它后缀")
        }
    }

switch的另外一种写法

    switch extname := ".a"; extname {
        case ".html": {
            fmt.Println(".html")
            break
        }
        case ".doc": {
            fmt.Println(".doc")
            break
        }
        case ".js": {
            fmt.Println(".js")
        }
        default: {
            fmt.Println("其它后缀")
        }
    }

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

    extname := ".txt"
    switch extname {
        case ".html": {
            fmt.Println(".html")
            break
        }
        case ".txt",".doc": {
            fmt.Println("传递来的是文档")
            break
        }
        case ".js": {
            fmt.Println(".js")
        }
        default: {
            fmt.Println("其它后缀")
        }
    }

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

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

    extname := ".txt"
    switch extname {
        case ".html": {
            fmt.Println(".html")
            fallthrought
        }
        case ".txt",".doc": {
            fmt.Println("传递来的是文档")
            fallthrought
        }
        case ".js": {
            fmt.Println(".js")
            fallthrought
        }
        default: {
            fmt.Println("其它后缀")
        }
    }

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

2、循环语句

2.1、for 循环结构

Go语言中的所有循环类型均可使用for关键字来完成

for循环的基本格式如下:

    for 初始语句; 条件表达式; 结束语句 {
        循环体
    }
  • 第一种写法:

      for i := 1 ; i <= 10; i++ {
          fmt.Println(i)
      }
    
  • 第二种写法:和 C 的 while 一样:

    for condition { }

    示例:
    i := 1
    for ; i <= 10; i++ {
        fmt.Println(i)
    }
  • 第三种写法
    i := 1
    for i <= 10{
        fmt.Println(i)
        i++
    }
  • 第四种写法:和 C 的 for(;;) 一样:
   for { } 

   示例:
   i := 1
   for {
        if i <= 10{
            fmt.Println(i)
        }else{
            break
        }
        i++
   }

条件表达式返回true时循环体不停地进行循环,直到条件表达式返回false时自动退出循环

实例:打印1 ~ 10

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

2.2、for range(键值循环)

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

    for key, value := range oldMap {
        newMap[key] = value
    }
  • 数组、切片、字符串返回索引和值。
  • map返回键和值。
  • 通道(channel)只返回通道内的值。

实例:遍历字符串

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

遍历切片(数组)

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

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

2.3、循环嵌套

    for [condition |  ( init; condition; increment ) | Range]
    {
       for [condition |  ( init; condition; increment ) | Range]
       {
          statement(s);
       }
       statement(s);
    }

2.4、循环控制语句

2.4.1、break:跳出循环

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

  • 用于循环语句中跳出循环,并开始执行循环之后的语句。
  • break在switch(开关语句)中在执行一条case后跳出语句的作用。
  • 在多重循环中,可以用标号label标出想break的循环。
    var i = 0
    for  {
        if i == 10{
            fmt.Println("跳出循环")
            break
        }
        i++
        fmt.Println(i)
    }

使用label

    package main

    import "fmt"

    func main() {

        // 不使用标记
        fmt.Println("---- break ----")
        for i := 1; i <= 3; i++ {
            fmt.Printf("i: %d\n", i)
                    for i2 := 11; i2 <= 13; i2++ {
                            fmt.Printf("i2: %d\n", i2)
                            break
                    }
            }

        // 使用标记
        fmt.Println("---- break label ----")
        re:
            for i := 1; i <= 3; i++ {
                fmt.Printf("i: %d\n", i)
                for i2 := 11; i2 <= 13; i2++ {
                    fmt.Printf("i2: %d\n", i2)
                    break re
                }
            }
    }
    ---- break ----
    i: 1
    i2: 11
    i: 2
    i2: 11
    i: 3
    i2: 11
    ---- break label ----
    i: 1
    i2: 11

2.4.2、 continue:跳过当前循环的剩余语句,然后继续进行下一轮循环

  • Go 语言的 continue 语句 有点像 break 语句。但是 continue 不是跳出循环,而是跳过当前循环执行下一次循环语句。
  • for 循环中,执行 continue 语句会触发 for 增量语句的执行。
  • 在多重循环中,可以用标号 label 标出想 continue 的循环。
    package main

    import "fmt"

    func main() {

        // 不使用标记
        fmt.Println("---- continue ---- ")
        for i := 1; i <= 3; i++ {
            fmt.Printf("i: %d\n", i)
                for i2 := 11; i2 <= 13; i2++ {
                    fmt.Printf("i2: %d\n", i2)
                    continue
                }
        }

        // 使用标记
        fmt.Println("---- continue label ----")
        re:
            for i := 1; i <= 3; i++ {
                fmt.Printf("i: %d\n", i)
                    for i2 := 11; i2 <= 13; i2++ {
                        fmt.Printf("i2: %d\n", i2)
                        continue re
                    }
            }
    }
    ---- continue ---- 
    i: 1
    i2: 11
    i2: 12
    i2: 13
    i: 2
    i2: 11
    i2: 12
    i2: 13
    i: 3
    i2: 11
    i2: 12
    i2: 13
    ---- continue label ----
    i: 1
    i2: 11
    i: 2
    i2: 11
    i: 3
    i2: 11

2.4.3、 goto:跳转到指定标签

  • Go 语言的 goto 语句可以无条件地转移到过程中指定的行。
  • goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
  • 但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
    goto label;
    ..
    .
    label: statement;
    var n = 20
    if n > 24 {
        fmt.Println("成年人")
    } else {
        goto lable3
    }

    fmt.Println("aaa")
    fmt.Println("bbb")
lable3:
    fmt.Println("ccc")
    fmt.Println("ddd")

results matching ""

    No results matching ""