Go中统一处理接口调用错误的核心是封装客户端层,涵盖HTTP请求、响应解析、业务状态判断与错误归一化;定义泛型Response[T]和ApiError类型,集成超时、重试、鉴权、日志等中间件,使业务调用简洁且可测。

在 Go 中统一处理接口调用错误,核心是把“发起 HTTP 请求 → 解析响应 → 判断业务状态 → 统一错误封装”这一链路收口到一个可复用的客户端层,避免每个接口都重复写 if err != nil、if resp.StatusCode != 200、json.Unmarshal 等逻辑。
定义统一的响应结构与错误类型
先约定后端返回格式(如 RESTful 常见的 { "code": 0, "msg": "ok", "data": {} }),再定义 Go 中对应的通用响应体和错误类型:
- 用泛型定义
Response[T],支持任意 data 类型 - 自定义错误类型(如
ApiError)实现error接口,携带Code、Message、RawBody等字段 - 将 HTTP 错误(连接超时、DNS 失败)、状态码异常(4xx/5xx)、业务 code 非 0 都归入该错误类型,便于上层统一判断
封装 HTTP 客户端调用方法
基于 http.Client 封装一个带默认配置(超时、Header、重试等)的客户端,并提供泛型方法:
DoRequest(ctx context.Context, method, url string, reqBody, respData any) error- 内部完成:序列化请求体 → 发起 HTTP 调用 → 检查网络/状态码错误 → 反序列化响应体 → 校验业务 code → 构造并返回
ApiError或 nil - 对 GET 请求可额外提供
GetJSON(url string, params url.Values, respData any) error,自动拼接 query
按需注入中间件式逻辑
在调用链中插入可选行为,不侵入主流程:
立即学习“go语言免费学习笔记(深入)”;
- 请求前:自动加鉴权 Header(如 Bearer Token)、TraceID、签名
- 响应后:记录耗时与状态码、打印 debug 日志(开发环境)、自动刷新 token(遇到 401 且有 refresh token 时)
- 通过函数选项(Functional Options)或中间件切片方式组装,保持扩展性
上层业务调用简洁清晰
最终业务代码只需关注“要什么”,不关心“怎么拿”:
err := client.PostJSON("/api/user", &req, &resp)- 错误统一用
errors.As(err, &apiErr)断言,再根据apiErr.Code做业务分支(如 1001=用户不存在,1002=权限不足) - 成功时
resp已是反序列化后的结构体,无需手动 json.Unmarshal
不复杂但容易忽略的是:错误分类要明确(网络层 / HTTP 层 / 业务层),日志要保留原始响应体用于排查,以及为测试预留 mock 接口能力(比如允许替换底层 http.RoundTripper)。










