go统一返回结果集(包括分页结果集)

package response

import (
	"net/http"
	"reflect"

	"github.com/gin-gonic/gin"
)

//统一响应集

type Response struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"`
}

// PageResult 分页结果返回
//type PageResult struct {
//	Total int64       `json:"total"`
//	List  interface{} `json:"list"`
//}

// Success 请求成功返回
func Success(message string, data any, c *gin.Context) {
	c.JSON(http.StatusOK, Response{200, message, data})
}

// Failed 请求失败返回
func Failed(message string, c *gin.Context) {
	c.JSON(http.StatusOK, Response{400, message, 0})
}

// SuccessPage 请求成功返回分页结果
//func SuccessPage(message string, data interface{}, rows int64, c *gin.Context) {
//	page := &PageResult{Total: rows, List: data}
//	c.JSON(http.StatusOK, Response{200, message, page})
//}

// 分页结果集结构体
type PageResult struct {
	Total int64       `json:"total"` // 总记录数
	List  interface{} `json:"list"`  // 当前页数据列表
}

func SuccessPage(message string, data []interface{}, page int64, size int64, c *gin.Context) {

	var total int64

	if page <= 0 && size < 0 {
		page = 1
		size = int64(getSliceLength(data))
	}

	if page == 0 {
		page = 1
	}

	var pageTotal int64
	if getSliceLength(data) != 0 {
		if int64(getSliceLength(data))%size == 0 {
			pageTotal = int64(getSliceLength(data)) / size
		} else {
			pageTotal = int64(getSliceLength(data))/size + 1
		}
	} else {
		pageTotal = 0
	}

	if page > pageTotal {
		page = 1
		size = int64(getSliceLength(data))
	}

	if isArray(data) {
		// 判断是否为数组
		total = int64(getArrayLength(data))
	} else if isSlice(data) {
		// 判断是否为切片
		total = int64(getSliceLength(data))
	}

	start := (page - 1) * size
	end := page * size
	if end > total {
		end = total
	}

	// 获取当前页数据列表
	currentPageData := data[start:end]

	// 创建分页结果集
	pageResult := PageResult{
		Total: total,
		List:  currentPageData,
	}

	//c.JSON(http.StatusOK, pageResult)
	c.JSON(http.StatusOK, Response{200, message, pageResult})

	//c.JSON(http.StatusOK, Response{200, message, page})
}

func isArray(v interface{}) bool {
	t := reflect.TypeOf(v)
	return t.Kind() == reflect.Array
}

func isSlice(v interface{}) bool {
	t := reflect.TypeOf(v)
	return t.Kind() == reflect.Slice
}

func getArrayLength(arr interface{}) int {
	v := reflect.ValueOf(arr)
	return v.Len()
}

func getSliceLength(slice interface{}) int {
	v := reflect.ValueOf(slice)
	return v.Len()
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值