Go语言基础——流程语句

105 阅读2分钟

if语句

func main() {
    //if语句
    num := 11
    if num % 2 == 0 {
        fmt.Println("偶数")
    }else{
        fmt.Println("奇数")
    }

    score := 55
    if score >= 90 {
        fmt.Println("优")
    }else if score >= 80 {
        fmt.Println("良")
    }else if score >= 60 {
        fmt.Println("一般")
    }else{
        fmt.Println("不及格")
    }

    // if statement; condition
    if num := 11; num % 2 == 0 {
        fmt.Println("偶数")
    }else{
        fmt.Println(num)
    }
    //fmt.Println(num)
}

switch语句

func main{
    score := 95
    switch {
        case score >= 90:
            grade = "A"
            fmt.Println("优")
        case score >= 80 && score<= 89:
            grade = "B"
        case score >= 70 && score<= 79:
            grade = "C"
        case score >= 70 && score<= 79:
            grade = "D"
        default:
            grade = "E"
    }
    
    
    //不同的 case 表达式使用逗号分隔。一分支多值
    var a = "daddy"
    switch a {
        case "mum", "daddy":
            fmt.Println("family")
    }
    
    var x interface{}
    switch i := x.(type) {
    case nil:
         fmt.Printf(" x 的类型 :%T",i)
    case int:
         fmt.Printf("x 是 int 型")
    case float64:
         fmt.Printf("x 是 float64 型")
    case func(int) float64:
         fmt.Printf("x 是 func(int) 型")
    case bool, string:
         fmt.Printf("x 是 bool 或 string 型" )
    default:
         fmt.Printf("未知型")
    }

}

循环语句

package main

import "fmt"

func main()  {
    //for init; condition; post { } 计算1-10的和
    sum := 0
    for i := 1; i<=10; i++ {
        sum += i
    }
    fmt.Println(sum)

    //循环字符串
    name := "name:程序员"
    for _, value := range name {
        fmt.Printf("%c\n",  value)
        //fmt.Println(index, value)
    }

    //在做字符串遍历的时候要尽量使用range,字符串有中文时,可以将字符串转为rune数组
    name_arr := []rune(name)
    for i := 0; i<len(name_arr); i++ {
        fmt.Printf("%c\n", name_arr[i])
    }

}

goto语句

Go 语言的 goto 语句可以无条件地转移到过程中指定的行。

goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

goto 语句流程图如下:

示例:

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var a int = 10

   /* 循环 */
   LOOP: for a < 20 {
      if a == 15 {
         /* 跳过迭代 */
         a = a + 1
         goto LOOP
      }
      fmt.Printf("a的值为 : %d\n", a)
      a++    
   }  
}

应用场景

使用 goto 退出多层循环

痛点

package main
import "fmt"
func main() {
    var breakAgain bool
    // 外循环
    for x := 0; x < 10; x++ {
        // 内循环
        for y := 0; y < 10; y++ {
            // 满足某个条件时, 退出循环
            if y == 2 {
                // 设置退出标记
                breakAgain = true
                // 退出本次循环
                break
            }
        }
        // 根据标记, 还需要退出一次循环
        if breakAgain {
                break
        }
    }
    fmt.Println("done")
}

改良版本

package main
import "fmt"
func main() {
    for x := 0; x < 10; x++ {
        for y := 0; y < 10; y++ {
            if y == 2 {
                // 跳转到标签
                goto breakHere
            }
        }
    }
    // 手动返回, 避免执行进入标签
    return
    // 标签
breakHere:
    fmt.Println("done")
}

统一错误处理

    err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:  // 在onExit标签内统一处理错误
    fmt.Println(err)
    exitProcess()