如何在Golang中实现自定义错误类型_Golang自定义错误类型的定义与使用-Golang

Go自定义错误类型旨在区分错误种类并携带上下文字段,应使用导出字段的struct实现error接口,配合errors.Is/As进行健壮判断,避免敏感数据和大对象,确保调用链中类型穿透一致。

Go 里自定义错误类型不是为了“看起来更专业”,而是为了解决两个实际问题:能区分错误种类(比如 IsTimeoutErr 还是 IsAuthFailed),以及能携带上下文字段(比如失败的 UserID、重试次数 RetryCount)。

用 struct 实现 error 接口是最常用且可控的方式

Go 的 error 就是个接口:type error interface { Error() string }。只要实现这个方法,就是合法错误。用 struct 而非 string 或 fmt.Errorf 包装,是为了可扩展性。

常见错误写法是直接返回 fmt.Errorf("user %d not found", id) —— 这类错误无法被程序逻辑识别,只能靠字符串匹配,脆弱且不可靠。

正确做法是定义一个结构体:

type UserNotFoundError struct {
    UserID int
    Source string // 可选:标记来自 DB 还是 Cache
}

func (e *UserNotFoundError) Error() string {
    return fmt.Sprintf("user %d not found in %s", e.UserID, e.Source)
}

这样调用方就能用类型断言精准识别:

if err != nil {
    if _, ok := err.(*UserNotFoundError); ok {
        // 触发降级逻辑,不记录告警
        return fallbackData()
    }
    // 其他错误走通用处理
}
  • 务必导出结构体字段(首字母大写),否则外部包无法访问 UserID 等上下文
  • 不要在 Error() 方法里做耗时操作(如日志、网络请求),它可能被多次调用
  • 如果错误不需要额外字段,用 errors.New("xxx") 更轻量,不必强上 struct

用 errors.Is 和 errors.As 替代类型断言

Go 1.13 引入了 errors.Is 和 errors.As,它们能穿透多层包装错误(比如被 fmt.Errorf("wrap: %w", err) 包过),比裸类型断言更健壮。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何在Golang中实现自定义错误类型_Golang自定义错误类型的定义与使用-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001373+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001373+
  • 本周更新: 0+
  • 最后更新: 2026-03-16