if 条件 - Go 流程控制
if 语句是 Go 最基本的条件控制语句。Go 的 if 语句简洁灵活,支持初始化语句,是错误处理的核心工具。
📌 核心概念
❓
条件判断
布尔表达式
if condition
🔀
else 分支
条件不满足
else
📝
初始化语句
if 前初始化
if x := f();
✅
错误处理
if err != nil
错误检查
基础用法
📝 if 语句基本形式
package main
import "fmt"
func main() {
// 基本 if
x := 10
if x > 5 {
fmt.Println("x is greater than 5")
}
// if-else
if x%2 == 0 {
fmt.Println("x is even")
} else {
fmt.Println("x is odd")
}
// if-else if-else
if x < 5 {
fmt.Println("x is small")
} else if x < 15 {
fmt.Println("x is medium")
} else {
fmt.Println("x is large")
}
}
💡 if 语句要点
- 括号可选: 条件不需要括号
- 花括号必需: 即使只有一行代码
- 布尔表达式: 条件必须是 bool 类型
- 作用域: 初始化语句的变量只在 if 块内有效
初始化语句
📝 if 前初始化
package main
import "fmt"
func main() {
// 带初始化语句的 if
if x := getValue(); x > 5 {
fmt.Println("x is greater than 5")
}
// x 在这里不可用
// 常见模式:函数调用 + 错误检查
if result, err := doSomething(); err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
// 多个初始化
if a := 1; a > 0 {
if b := 2; b > 0 {
fmt.Println(a + b)
}
}
}
func getValue() int {
return 10
}
func doSomething() (int, error) {
return 42, nil
}
错误处理
📝 if 错误检查模式
package main
import (
"fmt"
"os"
)
func main() {
// 标准错误检查模式
file, err := os.Open("file.txt")
if err != nil {
fmt.Println("Failed to open file:", err)
return
}
defer file.Close()
// 多个错误检查
data, err := os.ReadFile("config.json")
if err != nil {
if os.IsNotExist(err) {
fmt.Println("File does not exist")
} else if os.IsPermission(err) {
fmt.Println("Permission denied")
} else {
fmt.Println("Error:", err)
}
return
}
fmt.Println(string(data))
}
// 早期返回模式
func processFile(path string) error {
file, err := os.Open(path)
if err != nil {
return err // 早期返回
}
defer file.Close()
// 正常处理逻辑...
return nil
}
实用模式
1. 守卫子句
📝 提前返回模式
// ❌ 不推荐:嵌套过深
func process(data []int) error {
if data != nil {
if len(data) > 0 {
if data[0] > 0 {
// 处理逻辑
}
}
}
return nil
}
// ✅ 推荐:守卫子句
func process(data []int) error {
if data == nil {
return fmt.Errorf("data is nil")
}
if len(data) == 0 {
return fmt.Errorf("data is empty")
}
if data[0] <= 0 {
return fmt.Errorf("first element must be positive")
}
// 正常处理逻辑
return nil
}
2. 类型断言检查
📝 类型检查
func processValue(v interface{}) {
// 类型断言检查
if num, ok := v.(int); ok {
fmt.Println("Integer:", num)
} else if str, ok := v.(string); ok {
fmt.Println("String:", str)
} else {
fmt.Println("Unknown type")
}
}
最佳实践
✅ if 语句使用建议
- 早期返回: 使用守卫子句减少嵌套
- 错误检查: 始终检查 error != nil
- 初始化语句: 利用 if 前初始化限制作用域
- 避免深层嵌套: 超过 3 层考虑重构