定义统一响应结构体Response包含Success、Message、Data和Code字段;2. 封装Error和Success函数用于返回标准化的错误和成功响应;3. 使用RecoverMiddleware中间件捕获panic并返回统一错误格式;4. 在Handler中通过Error函数返回各类业务错误,确保前后端交互一致性。

在Golang Web开发中,统一错误返回格式有助于前端更好地处理响应,提升接口的规范性和可维护性。下面是一个常见的统一错误返回示例,基于标准HTTP状态码和自定义业务错误码设计。
统一响应结构定义
定义一个通用的API响应结构体,包含成功标志、消息、数据和错误码:
type Response struct { Success bool `json:"success"` Message string `json:"message"` Data interface{} `json:"data,omitempty"` Code int `json:"code"` }
Success 表示请求是否成功,Message 返回提示信息,Data 返回具体数据(成功时填充),Code 是业务或HTTP状态码。
错误响应封装函数
封装几个常用的返回方法,便于在Handler中调用:
立即学习“go语言免费学习笔记(深入)”;
func JSON(w http.ResponseWriter, statusCode int, data interface{}) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(statusCode) json.NewEncoder(w).Encode(data) } func Error(w http.ResponseWriter, message string, code int) { resp := Response{ Success: false, Message: message, Code: code, } JSON(w, code, resp) } func Success(w http.ResponseWriter, data interface{}, message string) { resp := Response{ Success: true, Message: message, Data: data, Code: http.StatusOK, } JSON(w, http.StatusOK, resp) }
通过 Error 函数可以统一返回错误,避免散落在各处的错误处理逻辑。
中间件中捕获异常
使用中间件捕获未处理的panic,并返回统一错误格式:
func RecoverMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { log.Printf("Panic: %v", err) Error(w, "Internal server error", http.StatusInternalServerError) } }() next.ServeHTTP(w, r) }) }
将此中间件注册到路由中,可防止服务因panic而中断,并保证错误格式一致。
在Handler中使用示例
实际业务处理中,可以这样返回错误:
func GetUserHandler(w http.ResponseWriter, r *http.Request) { // 模拟错误 if r.URL.Query().Get("id") == "" { Error(w, "User ID is required", http.StatusBadRequest) return } // 模拟查不到用户 user := getUserFromDB("123") if user == nil { Error(w, "User not found", http.StatusNotFound) return } Success(w, user, "User retrieved successfully") }
这样无论成功还是失败,前端收到的JSON结构都是一致的,便于统一处理。
基本上就这些。通过结构体+封装函数+中间件的方式,能有效实现Golang Web项目中的错误统一返回,提高代码整洁度和前后端协作效率。
js 前端 json go golang app usb 后端 路由 状态码 web项目 red golang 中间件 json 封装 Error 结构体 接口 http


