Golang实现深拷贝reflect原理示例探究
更新时间:2024年01月24日 10:43:47 作者:绍纳 nullbody笔记
这篇文章主要为大家介绍了Golang实现reflect深拷贝原理示例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
Golang reflect深拷贝
作为CRUD成员,是不是平时reflect使用的很少,一旦使用又不知道如何操作,通过学习本项目,加深对reflect理解。代码就是100行
通过本项目可以学到什么?
reflect各种基本使用
加深对各种数据类型的理解
理解的重点:
reflect.ValueOf()
表示将interface{}转成 reflect.Value结构体,这两个是等价的关系,reflect.Value的底层就是基于 interface{}。我们知道接口类型包含两个:动态类型和动态值,通过reflect.Value可以方便的获取这两个值。
reflect.New(origianl.Type()).Elem()
表示基于类型,new了一个该类型的指针,同时通过解引用Elem()该指针,得到该类型的对象。通过下图对比理解:

以这段代码作为理解范例
代码解析
copyRecursive 函数定义:将src的值,赋值给dest
src为指针类型,dest也是指针类型;我们可以直接 dest.Set(src),这个的含义就是将src的值赋值给dest,达到目的。但是一个指针a赋值给指针b,此时a和b指向的是同一个对象,并没有达到深拷贝的目的。【所以不行】
所以我们需要新建一个对象,让dest指针指向这个新对象,即可。那这个新对象的类型是什么?不就是 src指针指向的对象的类型嘛。。original := src.Elem()就获取到src指针指向的对象,类型那就是 original.Type().
所以新建的对象指针为 destValue := reflect.New(original.Type()),这个是不是很类似于C语言中的 int *p = new(int)
接下来,那就是让dest指向这个新指针即可 dest.Set(destValue)就是赋值的意思
虽然我们new了新对象,并且指向了该对象,但是该新对象的值其实都是初始值的 0值。所以需要继续调用copyRecursive函数,将original对象的值,复制给 destValue.Elem()对象

项目托管地址:https://github.com/gofish2020/deepCopy
以上就是Golang实现深拷贝原理示例探究的详细内容,更多关于Golang 深拷贝的资料请关注脚本之家其它相关文章!
相关文章
解析Golang中的锁竞争问题
这篇文章主要介绍了golang中的锁竞争问题,本文通过实例代码给大家详细讲解,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-10-10
Go语言结构化日志slog的用法解析
go 1.21.0 版本引入了一个新的包 log/slog,该包提供了结构化日志的功能,本文小编就来和大家聊聊log/slog 包的使用,感兴趣的小伙伴可以跟随小编一起学习一下
2023-10-10
Go语言Select chan用法小结
select语句是Go语言中用于处理多个通道操作的关键字,它允许你在多个通道上进行非阻塞的选择操作,本文就详细介绍一下如何使用,感兴趣的可以了解一下
2023-09-09
Go设计模式之迭代器模式讲解和代码示例
迭代器是一种行为设计模式, 让你能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素,本文将为大家详细介绍Go 迭代器模式,文中详细的代码示例,需要的朋友可以参考下
2023-07-07
详解go中的defer链如何被遍历执行
为了在退出函数前执行一些资源清理的操作,例如关闭文件、释放连接、释放锁资源等,会在函数里写上多个defer语句,多个_defer 结构体形成一个链表,G 结构体中某个字段指向此链表,那么go中的defer链如何被遍历执行,本文将给大家详细的介绍,感兴趣的朋友可以参考下
2024-01-01
Go语言使用HTTP包创建WEB服务器的方法
这篇文章主要介绍了Go语言使用HTTP包创建WEB服务器的方法,结合实例形式分析了Go语言基于HTTP包创建WEB服务器客户端与服务器端的实现方法与相关注意事项,需要的朋友可以参考下
2016-07-07
浅析Go语言的数据类型及数组
Golang是一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。本文主要和大家聊聊Go语言的数据类型及数组,希望对大家有所帮助
2022-11-11
Golang设计模式中抽象工厂模式详细讲解
抽象工厂模式用于生成产品族的工厂,所生成的对象是有关联的。如果抽象工厂退化成生成的对象无关联则成为工厂函数模式。比如本例子中使用RDB和XML存储订单信息,抽象工厂分别能生成相关的主订单信息和订单详情信息
2023-01-01
最新评论