如何使用Golang内置errors包创建错误_简单生成标准error对象

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.Iserrors.As

配合 if err != nil 使用

这是 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 }
// ...
}

与 fmt.Errorf 区分使用

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+)