控制结构

if 语句

Go 的 if 语句不需要括号,但必须有大括号:

if score >= 90 {
    fmt.Println("优秀")
} else if score >= 60 {
    fmt.Println("及格")
} else {
    fmt.Println("不及格")
}

if 的特殊用法 — 带初始化语句

if err := doSomething(); err != nil {
    fmt.Println("出错了:", err)
    return
}
// err 在这里不可见

for 循环

Go 语言只有 for 关键字,没有 whiledo-while

经典 for

for i := 0; i < 10; i++ {
    fmt.Println(i)
}

类似 while

n := 0
for n < 10 {
    n++
}

无限循环

for {
    // 直到 break
}

range 遍历

nums := []int{1, 2, 3, 4, 5}
for index, value := range nums {
    fmt.Printf("nums[%d] = %d
", index, value)
}

// 遍历 map
m := map[string]int{"a": 1, "b": 2}
for key, value := range m {
    fmt.Printf("%s -> %d
", key, value)
}

// 只遍历键
for key := range m {
    fmt.Println(key)
}

switch 语句

switch os := runtime.GOOS; os {
case "darwin":
    fmt.Println("macOS")
case "linux":
    fmt.Println("Linux")
default:
    fmt.Printf("%s
", os)
}

switch 默认不穿透,无需 break。如需穿透使用 fallthrough

score := 85
switch {
case score >= 90:
    fmt.Println("A")
case score >= 80:
    fmt.Println("B")
    fallthrough
case score >= 70:
    fmt.Println("C")
}

defer

defer 用于延迟执行,常用于资源释放:

func readFile(filename string) error {
    f, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer f.Close() // 函数返回前执行

    // 读取文件
    data := make([]byte, 100)
    _, err = f.Read(data)
    return err
}

实践建议

  1. 尽量使用 switch 代替多层 if-else
  2. 使用带初始化语句的 if 缩小变量作用域
  3. defer 确保资源释放
  4. range 时如果不需要索引,用 _ 忽略