如何为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


相关推荐: mysql怎么查询数据_mysql基础查询语句使用教程  虫虫助手如何更新游戏  Go语言中方法与接收器:指针和值类型的调用机制详解  《蓝色星原:旅谣》坐骑获取攻略  OpenWeatherMap API:通过城市名称获取天气预报数据指南  苹果手机手电筒无法开启  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  键盘保修需要什么_键盘售后维修流程  太平年在哪个平台播出  WooCommerce 新客户订单自动添加管理员备注教程  QQ邮箱注册地址 免费获取QQ邮箱账号  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略  怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】  惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  126邮箱网页在线登录2025_126邮箱网页版入口官方地址  WPS文字如何进行简繁转换  J*a列表元素格式化输出教程  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  性能与资源监视器快捷打开  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  如何取消数字签名  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  如何配置VS Code作为您Git操作的默认编辑器  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  PDF文件去水印平台入口 PDF水印删除网址  pubmed数据库官方主页_pubmed学术论文查找官网直达  店铺如何关联视频号推广?视频号推广有什么用?  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  百度网盘如何设置上传限额  江苏大剧院会员卡购买步骤  《海底捞》点外卖方法  如何使用 composer 和 aop-php 实现 AOP 编程?  Excel宏怎么删除_Excel中删除宏的详细操作流程  如何自定义苹果手机铃声  Flash AS3.0简易相册制作  怎么恢复删除的电脑文件_数据恢复软件使用教程  芒果TV官网登录入口 芒果TV官方网站登录入口  快手缓存清理方法  中大网校app做题记录清除方法  VS Code如何设置默认配置  vivo手机视频通话美颜怎么设置_vivo视频通话美颜开启方法  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  苹果自助维修计划支持哪些设备机型  鲁班大师乓乓皮肤获取方法  《兴业银行》注册登录方法 

 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.