Go函数多返回值需先检查err再用结果,否则可能因零值引发panic;推荐单行if检查、扁平化错误处理及用%w包装错误增强上下文。

Go语言函数支持多返回值,最常见的是“结果 + 错误”组合(如 value, err := someFunc())。正确处理这种模式是写出健壮Go代码的关键——核心原则是:先检查错误,再使用结果。
为什么必须先检查 err?
如果忽略或延后检查错误,直接使用可能为零值(zero value)的结果变量,容易引发逻辑错误或 panic。例如:
// ❌ 危险:未检查 err 就访问 data
data, err := readFile("missing.txt")
fmt.Println(len(data)) // data 可能是 nil,len(nil) panic!
// ✅ 正确:立即检查 err
data, err := readFile("missing.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(len(data)) // 此时 data 一定有效
常见错误检查写法
-
单行 if 初始化 + 判断:最推荐,作用域受限、简洁清晰
if data, err := readFile(path); err != nil {return nil, err}(注意:data 在此 if 块内才可用) -
显式声明变量后判断:适合需在多个分支复用结果的场景
data, err := readFile(path)if err != nil {return errors.Wrap(err, "read file failed")} -
忽略错误(仅限明确可忽略的场景):用下划线占位,但必须有注释说明原因
_, _ = fmt.Println("log") // 忽略打印失败,不影响主逻辑
处理多个调用的错误链路
连续调用多个可能出错的函数时,避免嵌套过深,优先提前返回:
- ❌ 不推荐(嵌套加深、可读性差):
if data, err := read(); err == nil {if parsed, err := parse(data); err == nil {return transform(parsed)}} - ✅ 推荐(扁平化、易维护):
data, err := read()if err != nil { return nil, err }parsed, err := parse(data)if err != nil { return nil, err }return transform(parsed)
自定义错误与错误包装
不要只返回原始错误,用 fmt.Errorf 或 errors.Wrap(需引入 github.com/pkg/errors)增强上下文:
立即学习“go语言免费学习笔记(深入)”;
-
if err != nil {return nil, fmt.Errorf("failed to decode JSON in %s: %w", filename, err)} - 使用
%w动词可保留原始错误链,方便后续用errors.Is或errors.As判断类型










