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)
配合 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:
立即学习“go语言免费学习笔记(深入)”;
-
errors.New("connection timeout")✅ 简洁明确 -
fmt.Errorf("failed to connect to %s: timeout", host)✅ 支持动态内容 -
fmt.Errorf("read header: %w", io.ErrUnexpectedEOF)✅ 支持错误链(Go 1.13+)










