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.Client 封装一个带默认配置(超时、Header、重试等)的客户端,并提供泛型方法:
DoRequest(ctx context.Context, method, url string, reqBody, respData any) errorApiError 或 nilGetJSON(url string, params url.Values, respData any) error,自动拼接 query在调用链中插入可选行为,不侵入主流程:
立即学习“go语言免费学习笔记(深入)”;
最终业务代码只需关注“要什么”,不关心“怎么拿”:
err := client.PostJSON("/api/user", &req, &resp)errors.As(err, &apiErr) 断言,再根据 apiErr.Code 做业务分支(如 1001=用户不存在,1002=权限不足)resp 已是反序列化后的结构体,无需手动 json.Unmarshal不复杂但容易忽略的是:错误分类要明确(网络层 / HTTP 层 / 业务层),日志要保留原始响应体用于排查,以及为测试预留 mock 接口能力(比如允许替换底层 http.RoundTripper)。