go 自定义排序,反射,序列化处理业务问题

场景:

   前端给后端传多个排序字段,当某一个不为0时,则使用对应指标排序,1为升序,2为降序

举例 order_by_a=0,order_by_b=1,order_by_c=0,则根据b指标进行排序,设定多个指标只会对其中一个进行排序,其余为0自动忽略,如果b相同,则按照D排序,指标数量可能递增

思路:

    1.传进来的多个指标需要判断是否走排序逻辑

func IsSort(c Conditions) bool {
	if c.OrderByA != 0 || c.OrderByB != 0 || c.OrderByC != 0 || c.OrderByD != 0  {
		return true
	}
	return false
}

2.构造排序函数

func init() {
	act = make(map[string]string)
	act["OrderByA"] = "A"
	act["OrderByB"] = "B"
	act["OrderByC"] = "C"
	act["OrderByD"] = "D"
}

func ActSort(resp1, resp2 Resp, c Conditions) bool {
	cmap := make(map[string]int)
	data, err := json.Marshal(c)  // 此处做marshal的原因将整个结构体序列化成字符串
	if err != nil {
		return false
	}
	sortFields := &models.SortField{}
	err = json.Unmarshal(data, sortFields)  // 将字符串反序列化成需要排序的几个指标
	data, err = json.Marshal(sortFields)
	err = json.Unmarshal(data, &cmap)     // 将字符串映射到map中
	if err != nil {
		return false
	}
	for k, v := range cmap {  // 此时cmap的key为排序指标,value为值(升序或者降序规则)
		if v == 0 { // 如果为0,则不按照此指标排序,直接跳过
			continue
		}
		target1 := reflect.ValueOf(resp1).FieldByName(act[k]).String() // 将排序指标映射到resp1的结构体的字段中,获取resp1中act[k]的值
		target2 := reflect.ValueOf(resp2).FieldByName(act[k]).String()
		D1 := reflect.ValueOf(resp1).FieldByName("D").String()
		D2 := reflect.ValueOf(resp2).FieldByName("D").String()
		if v == 1 {
			if target1 == target2 {
				return judgeString(D1, D2)
			}
			return judgeString(target1, target2)
		}
		if v == 2 {
			if target1 == target2 {
				return !judgeString(D1, D2)
			}
			return !judgeString(target1, target2)
		}
	}
	return true
}

func judgeString(num1, num2 string) bool {  // 字符串类型的整数数据排序规则,从大到小
	if len(num1) > len(num2) {  // 长度长的大
		return true
	} else if len(num1) < len(num2) { // 长度短的小
		return false
	}
	return num1 > num2  // 长度相同的则按照字符串的排序规则
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值