V
Vel·ToolKit
简洁 · 高效 · 即开即用
ZH
第 4 章 / 共 20 章

流程控制

if / for / switch / defer

if 语句

条件不需要括号;支持在 if 内声明局部变量。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "42"
    if v, err := strconv.Atoi(s); err == nil {
        fmt.Println("num:", v)
    } else {
        fmt.Println("not a number")
    }
}

for 循环

Go 只有 for,但能表达 C 风格三段式、while、无限循环、range 四种形式。

package main

import "fmt"

func main() {
    // 三段式
    for i := 0; i < 3; i++ {
        fmt.Println(i)
    }

    // while 风格
    n := 3
    for n > 0 {
        n--
    }
    fmt.Println("n=", n)

    // 无限循环 + break
    i := 0
    for {
        if i >= 2 {
            break
        }
        i++
    }

    // range:索引+值
    for i, v := range []int{10, 20, 30} {
        fmt.Println(i, v)
    }
}

switch

默认不穿透;可用任意表达式当 case,配合 fallthrough 显式穿透。无表达式形式可替代 if-else 链。

package main

import (
    "fmt"
    "time"
)

func main() {
    switch day := time.Now().Weekday(); day {
    case time.Saturday, time.Sunday:
        fmt.Println("weekend")
    default:
        fmt.Println("workday")
    }

    // 无表达式形式:替代 if-else 链
    score := 85
    grade := "F"
    switch {
    case score >= 90:
        grade = "A"
    case score >= 60:
        grade = "B"
    }
    fmt.Println("grade:", grade)
}

defer

defer 把语句延迟到所在函数返回前执行,后进先出。常用于关闭资源。

package main

import (
    "fmt"
    "os"
)

func main() {
    if err := readFile("/etc/hostname"); err != nil {
        fmt.Println("err:", err)
    }
}

func readFile(path string) error {
    f, err := os.Open(path)
    if err != nil {
        return err
    }
    defer f.Close() // 函数返回前自动调用

    info, err := f.Stat()
    if err != nil {
        return err
    }
    fmt.Println(info.Name(), info.Size())
    return nil
}

break / continue / goto

支持标签 break/continue 跳出嵌套循环;goto 仍存在但极少使用。