go中错误码和错误消息不应分开返回,而应通过自定义错误类型(如apperror)封装并实现error()方法,利用errors.is进行精确匹配,确保语义一致性和结构化处理。
Go 中错误码和错误消息该不该分开返回
不应该在函数签名里同时返回 error 和独立的错误码(如 int 或 string)。Go 的惯用法是让 error 本身携带足够上下文,包括可识别的错误码、原始消息、堆栈(可选)——否则调用方要写大量重复的 switch 去映射错误值到码,且极易漏处理。
真正需要区分的是:错误是否可恢复、是否需被上层决策(如重试/降级)、是否要透传给前端。这些靠错误类型(interface 实现)或错误包装(errors.As/errors.Is)来判断,而不是靠裸数字。
- 用自定义错误类型封装码和消息,例如
type AppError struct { Code int; Msg string },并实现Error() string - 用
fmt.Errorf("xxx: %w", err)包装底层错误,保留原始错误链 - 避免返回
(int, error)这类双值组合,它破坏了 Go 错误处理的一致性
如何定义和识别业务错误码
推荐用 iota 枚举定义错误码常量,并让每个码对应一个全局唯一的 var 错误变量(不是 struct 实例),这样能用 errors.Is(err, ErrUserNotFound) 精确匹配。
例如: