如何为Go API返回结构化错误_Go API错误结构设计指南


Go API结构化错误的核心是统一JSON格式,含Status、Code、Message、Detail(debug模式)、RequestID字段;需分层封装、避免裸error透出,集成HTTP处理器并设正确状态码,支持i18n与错误码文档化。

如何为go api返回结构化错误_go api错误结构设计指南

Go API 返回结构化错误的核心是:统一错误格式、区分错误类型、保留原始上下文、便于前端解析。不建议直接返回 error 字符串或裸 panic,而应设计可序列化、含状态码、错误码、用户提示和调试信息的 JSON 错误响应。

定义标准错误结构体

一个实用的错误结构需包含 HTTP 状态码、业务错误码、用户友好的消息、机器可读的错误 ID(可选)、以及开发用的详细原因(仅 debug 模式暴露):

  • Status:对应 HTTP 状态码(如 400、401、404、500)
  • Code:自定义业务错误码(如 "USER_NOT_FOUND"、"INVALID_EMAIL"),字符串更易维护和国际化
  • Message:面向终端用户的简明提示(如 "用户不存在")
  • Detail:可选字段,仅在 debug=true 时返回(如具体校验失败字段、SQL 错误原文)
  • RequestID:关联日志追踪,方便后端排查

示例结构:

type APIError struct {
    Status    int    `json:"status"`
    Code      string `json:"code"`
    Message   string `json:"message"`
    Detail    string `json:"detail,omitempty"`
    RequestID string `json:"request_id,omitempty"`
}

func (e *APIError) Error() string { return e.Message }

分层封装错误,避免裸 error 透出

不要让数据库错误、JSON 解析错误等底层 error 直接返回给客户端。应在 handler 层统一拦截并转换:

  • 使用中间件或 defer 捕获 panic,并转为 500 类错误
  • 对已知业务错误(如用户未登录、权限不足)主动构造 *APIError
  • 对未知错误(如第三方服务超时、DB 连接失败)统一降级为 500 + 通用码(如 "INTERNAL_ERROR"),不暴露敏感细节
  • 可借助 errors.Is / errors.As 判断错误类型,再做映射(例如识别 pgx.ErrNoRows → 404 + "USER_NOT_FOUND")

与 HTTP 处理器集成(以 net/http 为例)

在 handler 中返回错误时,不直接写 http.Error,而是统一调用一个响应函数:

稿定抠图 稿定抠图

AI自动消除图片背景

稿定抠图 80 查看详情 稿定抠图
  • 成功时:writeJSON(w, http.StatusOK, data)
  • 失败时:writeError(w, err) —— 内部判断是否为 *APIError,否则包装为 500
  • 确保 Content-Type 设为 application/json; charset=utf-8
  • 设置合适的 HTTP 状态码(别让所有错误都返回 200 + {“error”:…})

这样前端可通过 HTTP 状态码快速区分网络/服务异常 vs 业务异常。

可选增强:支持 i18n 与错误码文档化

若需多语言支持,Message 不宜硬编码,可改为 key(如 "user.not_found"),由前端或网关根据 Accept-Language 渲染;同时维护一份公开的错误码表(Markdown 或 OpenAPI x-error-codes 扩展),标注每个 Code 对应的场景、HTTP 状态、是否可重试等,提升协作效率。

基本上就这些。结构化错误不是堆砌字段,而是让错误成为 API 的一部分契约 —— 前端能预期、后端好定位、运维可追踪。

以上就是如何为Go API返回结构化错误_Go API错误结构设计指南的详细内容,更多请关注其它相关文章!


# 前端  # 何为  # 抠图  # 错误码  # 可选  # 加载  # 结构化  # 状态码  # 多语言  # 后端  # app  # 编码  # 处理器  # go  # json  # markdown  # js  # ai  # 金融网站建设模板  # 成都seo推广公司费用  # seo拉丁文  # 工作室网站建设经验  # 沈阳网站建设哪家技术好  # 辣子鸡食品营销推广方案  # 关键词的排名  # 蚌埠关键词排名怎么样  # 美发网络营销推广ppt  # 哪些产品适合网站推广卖  # 文档  # 资源管理 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 我的世界游戏平台入口 我的世界官方官网直达链接  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  《磁力猫》最好用的磁官网  《金山词霸》语音翻译方法  《原神》月之一版本新增书籍一览  AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?  鲁班大师乓乓皮肤获取方法  PHP utf8_encode 字符编码转换疑难解析与最佳实践  苹果手机手电筒无法开启  盲鳗善于分泌黏液猜猜主要用来做什么  Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  家里的小飞虫总是不断,用什么方法可以彻底根除?  《淘票票》添加到苹果钱包教程  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  Mac hosts文件在哪里_Mac修改hosts文件详细教程  c++类和对象到底是什么_c++面向对象编程基础  《米姆米姆哈》米姆获取及技能攻略  《图怪兽》退出登录方法  Python高效统计字典嵌套列表值在目标列表中的出现次数  铁路12306入口 铁路12306官网版入口登录网址  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  暴风影音官网正式版_暴风影音手机版官网下载安卓  msn官方入口2025登录 msn官网2025直达首页入口  百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法  VS Code源代码管理(SCM)视图的进阶使用技巧  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  邦丰播放器频道搜索设置  Python实时数据流中高效查找最大最小值  iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法  荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化  中通快递官网指定查询 中通快递单号查询平台入口  汽水音乐官网网页版入口 汽水音乐官网网页版在线入口  Python项目中的条件导入:解决跨模块依赖问题  SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱  《我的恋爱逃生攻略》中文名字输入方法  口腔诊所管理软件推荐  如何查找哪个composer包引入了特定的依赖?  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  Python测试中模块导入路径解析的最佳实践  React应用中Commerce.js数据加载与状态管理最佳实践  如何在CSS中设置背景图像:一个全面指南  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  冬季去哪个城市旅游更有可能观测到极光  Win10怎么设置快速启动 Win10开启快速启动设置方法  使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式  J*aScript装饰器_元编程实战  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  网易云音乐闹钟铃声设置教程 

 2025-12-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.