Go函数多返回值需先检查err再用结果,否则可能因零值引发panic;推荐单行if检查、扁平化错误处理及用%w包装错误增强上下文。
Go语言函数支持多返回值,最常见的是“结果 + 错误”组合(如 value, err := someFunc())。正确处理这种模式是写出健壮Go代码的关键——核心原则是:先检查错误,再使用结果。
如果忽略或延后检查错误,直接使用可能为零值(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 data, err := readFile(path); err != nil { return nil, err}(注意:data 在此 if 块内才可用)data, err := readFile(path)if err != nil { return errors.Wrap(err, "rea
d 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)增强上下文:
if err != nil { return nil, fmt.Errorf("failed to decode JSON in %s: %w", filename, err)}
%w 动词可保留原始错误链,方便后续用 errors.Is 或 errors.As 判断类型