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

【golang】使用reflect实现根据json tag对结构体数组排序 需求描述:调用方通过指定结构体某字段(如示例1中的project_id),后端服务基于该字段排序后将结构返回; 难点:后端视角与前端视角不一样,对于指定的字段,不能直接排序 解决方法: 法1:列举法 法2:反射机制 示例1: // 带json tag的结构体 type Data struct { ProjectId string `json:"project_id,omitempty"` ProjectName string `json:"project_name,omitempty"` } // 阅读详情

场景:

   前端给后端传多个排序字段,当某一个不为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  // 长度相同的则按照字符串的排序规则
}

Go 1.25 新特性深度解析:json/v2 重新定义 Go 的 JSON 处理 在 Go 语言开发中,是最常用、最基础的包之一。但你是否也经历过这些“经典痛苦”?性能差MarshalUnmarshal慢,尤其在高并发场景下成为瓶颈;内存高:频繁分配临时对象,GC 压力大;行为不一致nilSlice 序列化为null,但前端期望是[];不支持流式处理:大 JSON 文件无法逐块读取,内存爆掉;标签功能弱:无法自定义空值判断、字段排序、自动类型转换;UTF-8 乱码静默处理:非法字符被替换,数据损坏却无报错。 阅读详情

相关推荐

Go语言时间与JSON序列化:从RFC3339原理到自定义格式实战

在Web开发与API设计中,JSON作为主流数据交换格式,其序列化与反序列化是核心技术环节。时间数据的处理尤为关键,它涉及数据一致性、系统间互操作性和时区管理等基础问题。Go语言标准库encoding/json默认采用RFC3339格式进行时间序列化,这一设计基于国际标准,确保了跨平台和跨语言的数据可读性与无歧义解析。理解其底层实现——通过time.Time类型实现json.Marshaler接口——是掌握自定义格式的基础。在实际工程中,对接不同第三方系统或处理遗留数据时,常需适配多种时间格式,如“2006

weixin_34320159的博客 419

Go 解析 JSON 字符串的 key 先后顺序

当使用GO标准库解析动态JSON的时候,我们将结果解析为。而GOmap类型的key是无序的,也就是说你不能确定JSONkey的先后顺序。如果你需要确定JSONkey的顺序,可以使用jsonkeys包。

蛮吉是魁拔的博客 2475

dynamicgo 开源 :基于原始字节流的高性能+动态化 Go 数据处理!字节跳动开源!

01背景当前,Thrift 是字节内部主要使用的 RPC 序列化协议,在 CloudWeGo/Kitex 项目中优化和使用后,性能相比使用支持泛型编解码的协议如 JSON 有较大优势。但是在和业务团队进行深入合作优化的过程中,我们发现一些特殊业务场景并不能享受静态化代码生成所带来的高性能:动态反射:动态地 读取、修改、裁剪 数据包中某些字段,如隐私合规场景中字段屏蔽;数据编排:组合多个子数据包进行 排序、过滤、位移、归并 等操作,如某些 BFF (Backend For Frontent) 服务;协议转换:

weixin_45397903的博客 447

go中如何在json序列化/反序列化时保持对象的顺序

最近在用go重写一个java应用时,遇到了这个问题:原来的java程序返回的数据包含json规格的业务数据,以及一个基于该json串的md5指纹,客户端收到go返回的json数据后,首先验证签名正确,再解析json。json的解析过程符合典型的下推自动机模型,好在encoding/json中已经实现了scanner,并且decoder开放了json token的读取接口,而我们只要使用系统栈结构,稍加应用就可以实现这个PDA。因为json标准中是不要求对象顺序的,但实践中却不一定。

一只Coding猪 4644

Golang JWT验签与生成的五大底层陷阱及生产级实践

JWT(JSON Web Token)是一种广泛用于身份认证与信息交换的开放标准,其核心原理基于数字签名或MAC验证,确保payload不可篡改且来源可信。技术价值体现在无状态鉴权、跨域信任传递与微服务间轻量凭证共享。典型应用场景包括API网关鉴权、多租户SaaS系统、IoT设备认证及前后端分离架构。然而在Golang实践中,开发者常因忽略密钥加载时机、ECDSA PEM解析字节序、时钟偏移(clock skew)配置、自定义claims序列化规范及RS256/ES256算法选型边界,导致验签失败、性能瓶颈

weixin_33768481的博客 657

Go struct 内存布局与性能优化实战指南

Go struct 是 Go 语言中基础而关键的数据组织形式,其本质并非面向对象的‘类’,而是遵循内存对齐与 CPU 缓存特性的底层数据契约。理解字段对齐规则、padding 机制及导出控制,是实现高性能服务的前提。struct 字段顺序直接影响 GC 扫描开销、cache line 利用率和序列化效率;标签滥用则引发反射膨胀与语义冲突;嵌套与指针选择决定内存分配行为。本文围绕 Go struct 的内存布局原理、字段排序黄金法则、标签分层隔离、嵌套转指针实践及导出契约设计,结合支付系统真实压测数据(如 G

weixin_30872157的博客 547

【GoLang】【工具分享】1、根据 JsonTag 对 slice 进行稳定排序(不支持嵌套)

golang 根据 JsonTag 进行切片排序

Y-puyu 的博客 734

golang利用反射根据某一字段排序

golang 里面的反射其实很简单,无非分为两种: 一种是求值ValueOf、另一种是求类型TypeOf,Elem()方法相当于对一个指针取元素值的效果。

zhangxing 504

Go语言中自定义时间类型JSON序列化与反序列化的实战指南

在软件工程实践中,JSON作为主流的数据交换格式,其序列化与反序列化是数据交互的核心环节。Go语言通过encoding/json包提供了强大的JSON处理能力,其中时间类型的处理尤为关键。time.Time类型默认采用RFC3339格式进行编解码,该格式具有无歧义、字典序即时间序等优势,适用于现代API设计。然而,在实际业务场景中,常需对接遗留系统或满足特定前端框架要求,此时自定义时间格式成为刚需。通过实现json.Marshaler和json.Unmarshaler接口,开发者可灵活控制时间字段的序列化行

weixin_30512089的博客 442

Go-go有序map用于json输出有序key的对象和后端有序循环map取值

go 有序map,用于json输出有序key的对象和后端有序循环map取值

动态博弈、威胁与承诺(博弈论入门学习笔记四)

0 动态博弈 动态博弈:行动有先后顺序,不同的参与人在不同时点行动,先行动者的选择影响后行动者的选择空间,后行动者可以观察到先行动者做了什么选择。例如下棋、消费者和商家讨价还价、谈婚论嫁、企业之间的价格战等等。 因此,为了做出最优的行动选择,每个参与人都应该思考:如果我如此选择,对方将如何应对?如果我是他,我将会如何行动?给定他的应对,什么是我的最优选择? 动态博弈中的战略:在博弈开始之前就...

stepho的博客 1万+

探究|Go JSON 三方包哪家强?

综上,业务选型上需要根据具体情况、不同领域的业务使用场景和发展趋势进行选择,综合考虑各方面因素。最适配业务的才是最好的!例如:如果业务只是简单的解析 http 请求返回的 json 串的部分字段,并且字段都是确定的,偶尔需要搜索功能,那 Gjson 是很不错的选择。不太推荐使用 Jsoniter 库,原因在于: Go 1.8 之前,官方 Json 库的性能就收到多方诟病。不过随着 Go 版本的迭代,标准 json 库的性能也越来越高,Jsonter 的性能优势也越来越窄。

Ch3nnn的博客 728

【GD32篇】驱动AD7616完成数据采集

GD32F10X驱动AD7616完成数据采集

we_long的博客 1万+

从冒泡排序看Java、Go与前端技术栈的工程思维差异

排序算法是计算机科学的基础概念,其核心原理是通过比较和交换将数据元素按特定顺序重新排列。从简单的冒泡排序到高效的快速排序,算法的时间与空间复杂度直接影响程序性能。在工程实践中,排序任务的价值不仅在于算法本身,更在于如何结合语言特性和系统资源进行高效实现。不同的技术栈为此提供了截然不同的解决方案:Java强调面向对象与设计模式,通过抽象封装确保代码的健壮性和可维护性;Go凭借其轻量级并发原语,天然适合利用多核优势进行并行计算;而前端JavaScript则需在单线程事件循环中,通过Web Worker避免UI阻

weixin_30945039的博客 552

关于【中孚计算机终端保密检查系统】的卸载

卸载中孚计算机终端保密检查系统

码农之路,向死而生 4万+

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5942

Go语言加速机器学习数据预处理实战指南

在现代机器学习工程中,数据预处理与特征工程常占据70%以上延迟,成为实际性能瓶颈。理解JSON解析、内存管理、缓存策略和协程调度等底层原理,是突破Python GIL限制、实现确定性低延迟的关键。Go语言凭借无GIL并发模型、静态编译、零拷贝IO和可预测GC,在特征计算服务等CPU密集型非模型层展现出显著技术价值。本文聚焦真实风控场景下的Go+Python混合ML栈实践,涵盖高性能JSON解析、向量化特征计算、多级内存缓存设计及生产级部署调优,为构建高吞吐、低P99延迟的线上特征服务提供可复用的工程路径。

weixin_30580341的博客 478

人形机器人电源系统硬件开发:从原理图设计到PCB布局的完整流程

人形机器人是“移动的智能终端”,其电源系统如同“心脏+血管”:既要为大脑(主控)、肌肉(电机)、感官(传感器)提供稳定能量,又要在有限体积内应对高动态负载(如跳跃时电机瞬间大电流)。本文聚焦“硬件开发”维度,覆盖从需求分析到PCB制板的完整流程,适合硬件工程师、机器人爱好者快速掌握工程实战方法。

AI天才研究院 2174

Golang基础面试题汇总

channel、goroutine、slice、map、反射、内存、GC、Musql、Redis、ELK、K8s、Http、Https

weixin_41760738的博客 5696

微信小程序|基于小程序实现定位打卡功能

此文主要在小程序内实现打卡功能,可根据用户位置与公司设定的打卡范围实时判断打卡是否合法,并在后台对打卡记录进行管理。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

手把手教你实现RK3588的Secure Boot:密钥烧录与镜像签名验证

摘要:本文详细介绍了瑞芯微RK3588平台下SecureBoot的密钥烧录与镜像签名验证实现方法。首先阐述了SecureBoot的工作原理、安全优势及其在RK3588智能安防、工业控制等场景中的重要作用。接着分步骤指导了硬件准备、软件工具配置、密钥对生成等准备工作,并详细说明了进入烧录模式、工具选择配置、密钥烧录执行等关键操作流程。文章还解析了镜像签名生成与验证机制,包括启动验证流程和常见故障处理方法。最后对SecureBoot在RK3588设备中的未来应用进行了展望,强调其与TrustZone等安全技术融

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2045

2024年Golang面试进阶指南:深入GMP、GC与分布式系统设计

并发编程是构建高性能、高可用系统的核心技术,其核心在于理解并发原语、调度机制与内存管理。以Go语言为例,其GMP调度模型通过Goroutine、Machine和Processor的协作,结合工作窃取机制,实现了高效的并发执行。垃圾回收(GC)则采用三色标记法,通过写屏障等技术减少STW时间,保障程序性能。这些底层原理为开发分布式系统、微服务架构提供了坚实基础,尤其在云原生场景下,结合gRPC、服务发现、分布式锁等组件,能够构建出高并发、可扩展的后端服务。本文聚焦Golang面试热点,深入解析GMP模型、GC

weixin_30729609的博客 329

【GameFramework框架内置模块】17、声音(Sound)

声音(Sound)模块是管理音频的模块,比如播放、停止、修改音量等,支持淡入淡出、AudioMixer等高级设置。声音(Sound)的配置面板如下所示:所有的声音统一按照组来分,可以根据需要添加或者溢出组,声音组可以配置Agent的数量和音量等。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1912

Go语言map底层原理与并发安全实战指南

Go语言中的map是一种基于哈希表实现的键值对集合类型,其核心原理涉及hmap控制结构、bmap桶布局及渐进式扩容机制。作为非线程安全的数据结构,原生map在并发读写时会触发panic,需结合sync.RWMutex、分片锁或sync.Map等方案保障安全性。该类型广泛应用于缓存、配置管理、元数据存储等场景,但存在内存不释放、迭代不确定性、键类型隐性开销等工程陷阱。理解其内存模型与运行时行为,是编写高性能、低延迟Go服务的关键基础。

weixin_34384557的博客 379

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Go字符串格式化:从fmt.Sprintf到strings.Builder的性能与工程实践

字符串格式化是编程语言中将结构化数据转换为可读文本的基础能力,其核心涉及内存分配、类型安全与运行时开销。在Go中,它远不止语法便利——fmt.Sprintf隐含反射与堆逃逸,strings.Builder提供零拷贝拼接,text/template支撑动态模板,而unsafe.String则面向极致性能场景。理解不同方案的原理差异(如逃逸分析、反射成本、编译期 vs 运行时处理)直接决定高并发服务的GC压力、P95延迟与可观测性质量。本文聚焦Go工程实践中最常被低估的字符串构造环节,结合真实压测数据与线上故障

weixin_34015336的博客 397

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Go泛型编程

泛型是Go 1.18版本引入的重大语言特性,它让Go程序员能够编写类型安全且可复用的代码。本文参考了Go官方泛型教程(go.dev/doc/tutorial/generics)、Go官方博客(go.dev/blog/generic-interfaces)以及社区最佳实践,系统地讲解了类型参数、类型约束、泛型函数和泛型类型的概念与用法。

星航夜空的帆舟 283
上一篇: 滴滴转正面试
下一篇: LeetCode 1. 两数之和
error0318
博客等级 码龄9年 57粉丝 515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值