go同名字段复制工具函数(类似BeanUtils.copy)介绍和性能测试

本文介绍了Go中一个用于不同类型结构体同名字段复制的工具函数,类似于Java的BeanUtils.copy。文章详细阐述了问题背景、解决方案、注意事项,并进行了性能测试。测试结果显示,虽然反射拷贝的性能随着字段数量增加呈线性增长,但相对于手动赋值,反射拷贝在提高开发效率方面仍有其价值,尤其在处理多个字段的结构体时,其带来的耗时可以忽略不计。
摘要由CSDN通过智能技术生成

介绍说明:

本文是在介绍一个go的不同类型结构体的复制工具函数,能减少重复劳动,提高开发效率,让代码可读性强,减少出错几率

本篇包含背景的介绍,工具函数源码的展示,性能测试等部分

问题背景:

故事的起因是看到了业务代码里有些字段比较多的部分,比如获取订单详情大概涉及到大几十个字段的复制,会有几十行甚至上百行的x.a = y.a这样的代码

 

即问题的根源是dto和vo是不同类型的结构题,但是又有很多同类型同名的公共字段需要复制(因结构体类型不同,无法直接copy出一份,只能挨个字段手动赋值)

解决方案:

由此想到了java里这种问题可以用beanUtils.copy方法解决,可以自动复制同名同类型字段的值

beanUtil是利用反射实现的,既然go也有反射,那么理论上也可以实现,就在网上找了下,果然有人写过了,很短:

代码:

func SimpleCopyProperties(dst, src interface{}) (err error) {
	// 防止意外panic
	defer func() {
		if e := recover(); e != nil {
			err = errors.New(fmt.Sprintf("%v", e))
		}
	}()

	dstType, dstValue := reflect.TypeOf(dst), reflect.ValueOf(dst)
	srcType, srcValue := reflect.TypeOf(src), reflect.ValueOf(src)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值