控制结构
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 关键字,没有 while 和 do-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
}
实践建议
- 尽量使用
switch代替多层if-else - 使用带初始化语句的
if缩小变量作用域 - 用
defer确保资源释放 - range 时如果不需要索引,用
_忽略
