Skip to content

1.4 流程控制 ​

if/else 条件语句 ​

go
package main

import (
    "fmt"
    "time"
)

func main() {
    // 基本 if
    age := 20
    if age >= 18 {
        fmt.Println("成年人")
    }

    // if-else
    if age >= 60 {
        fmt.Println("老年人")
    } else if age >= 18 {
        fmt.Println("成年人")
    } else {
        fmt.Println("未成年")
    }

    // if 初始化语句
    if hour := time.Now().Hour(); hour < 12 {
        fmt.Println("上午好")
    } else {
        fmt.Println("下午好")
    }

    // 错误检查模式
    result, err := doSomething()
    if err != nil {
        fmt.Println("出错了:", err)
        return
    }

    // Guard Clause
    if err := validate(); err != nil {
        return err
    }
    // 主逻辑
}

func doSomething() (string, error) {
    return "result", nil
}

func validate() error {
    return nil
}

switch 语句 ​

go
package main

import (
    "fmt"
    "runtime"
    "time"
)

func main() {
    // 基本 switch
    day := time.Now().Weekday()
    switch day {
    case time.Monday:
        fmt.Println("周一")
    case time.Tuesday, time.Wednesday:
        fmt.Println("周二或周三")
    default:
        fmt.Println("其他")
    }

    // switch 带初始化
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("macOS")
    case "linux":
        fmt.Println("Linux")
    default:
        fmt.Println("其他")
    }

    // 无条件 switch
    num := 75
    switch {
    case num < 50:
        fmt.Println("0-49")
    case num < 100:
        fmt.Println("50-99")
    default:
        fmt.Println("100 以上")
    }
}

Type Switch ​

go
package main

import "fmt"

func main() {
    var values []any = []any{"hello", 42, 3.14, true}

    for _, v := range values {
        switch val := v.(type) {
        case int:
            fmt.Printf("整数:%d\n", val)
        case string:
            fmt.Printf("字符串:%s\n", val)
        case float64:
            fmt.Printf("浮点数:%.2f\n", val)
        default:
            fmt.Printf("未知类型:%T\n", val)
        }
    }
}

for 循环 ​

go
package main

import "fmt"

func main() {
    // 传统 for
    sum := 0
    for i := 0; i < 10; i++ {
        sum += i
    }
    fmt.Println(sum)  // 45

    // while 风格
    count := 0
    for count < 5 {
        count++
    }

    // 无限循环
    for {
        break
    }

    // range 遍历切片
    nums := []int{1, 2, 3}
    for i, v := range nums {
        fmt.Println(i, v)
    }

    // range 遍历 Map
    m := map[string]int{"a": 1}
    for k, v := range m {
        fmt.Println(k, v)
    }

    // range 遍历字符串
    for i, r := range "你好" {
        fmt.Println(i, r)
    }
}

break, continue, goto ​

go
package main

import "fmt"

func main() {
    // break
    for i := 0; i < 10; i++ {
        if i == 5 {
            break
        }
        fmt.Print(i, " ")  // 0 1 2 3 4
    }

    // 标签 break
Outer:
    for i := 0; i < 3; i++ {
        for j := 0; j < 3; j++ {
            if i+j == 3 {
                break Outer
            }
        }
    }

    // continue
    for i := 0; i < 5; i++ {
        if i == 2 {
            continue
        }
        fmt.Print(i, " ")  // 0 1 3 4
    }
}

defer 语句 ​

go
package main

import "fmt"

func main() {
    defer fmt.Println("最后执行")
    fmt.Println("先执行")

    // 资源清理
    cleanup()

    // recover 捕获 panic
    safeFunc()
}

func cleanup() {
    fmt.Println("获取资源")
    defer fmt.Println("释放资源")
}

func safeFunc() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("捕获 panic:", r)
        }
    }()
    panic("出错了")
}