Go 1.13+ 推荐用 errors.New 创建轻量、标准的不可变字符串错误,适用于固定消息场景;需定义包级变量(如 var ErrNotFound = errors.New("user not found"))并用 errors.Is 比较,避免直接 ==。
Go 1.13+ 推荐用 errors.New 创建基础错误,它返回一个实现了 error 接口的不可变字符串错误对象,轻量、标准、无需额外依赖。
适用于固定消息、无需携带上下文或堆栈的场景,比如参数校验失败:
err := errors.New("invalid user ID")err.Error() 返回 "invalid user ID"
errors.New("same msg") 生成的是不同地址的错误实例,不能用 == 比较相等性(应使用 errors.Is 或 errors.As)这是 Go 最常见的错误处理模式,errors.New 生成的 error 可直接参与判断:
if err == errors.New("not found")(每次新建对象地址不同)if errors.Is(err, ErrNotFound)(需预先定义变量)var ErrNotFound = errors.New("user not found")
func FindUser(id int) (User, error) {
if id <= 0 { return User{}, ErrNotFound }
// ...
}
errors.New 适合静态、无格式化需求的错误;需要插值或包装时,优先选 fmt.Errorf:
errors.New("connection timeout") ✅ 简洁明确fmt.Errorf("failed to connect to
%s: timeout", host) ✅ 支持动态内容fmt.Errorf("read header: %w", io.ErrUnexpectedEOF) ✅ 支持错误链(Go 1.13+)