格式封装

场景:希望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)
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐