介绍说明:
本文是在介绍一个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)
//