格式封装
场景:希望http的返回内容格式固定,包含自定义的多个字段,json格式。查询等得到的数据全部挂在“data”这个key底下。格式形如:
{
"code": code,
"msg": msg,
"count": count,
"data": data
}
package util
import (
"net/http"
"github.com/gin-gonic/gin"
)
// code 自己定义的状态码
// msg 返回的信息
// count 返回的内容的长度/数量
// data 返回的内容
func Response(context *gin.Context, httpStatus int, code int, msg string, count int, data interface{}) {
context.JSON(httpStatus, gin.H{
"code": code,
"msg": msg,
"count": count,
"data": data,
})
}
func ResponseOK(context *gin.Context, count int, data interface{}) {
context.JSON(http.StatusOK, gin.H{
"code": "0",
"msg": "Success",
"count": count,
"data": data,
})
}
// todo 其它函数按需扩展
// todo 可对code做枚举
// todo 可对msg做枚举和翻译
注意:
这里data的数据类型是空接口,网上很多文档中写的是gin.H,但是调用会报错。
于是查了一下gin.H的含义:
gin.H实际上就是map[string]interface{},
而interface{} 可以代表任意类型,
interface{} 就是一个空接口,所有类型都实现了这个接口,所以它可以代表所有类型,
所以我们可以用map的形式插入任意类型数据,
那么,既然传入的data是不确定的类型,那么我们这里使用空接口类型即可。
controller层
在controller层,即可使用该格式封装函数
package controller
import (
"myprojectname/dao"
"myprojectname/util"
"github.com/gin-gonic/gin"
)
type UserController struct {
}
func (u UserController) UserQueryAll(c *gin.Context) {
userdao := dao.UserDAO{}
users := userdao.UserQueryAll()
// 原来的调用方式
// c.JSON(http.StatusOK, gin.H{
// "data": users,
// })
util.ResponseOK(c, len(users), users)
}