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 深拷贝的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言实现MapReduce的示例代码

    Go语言实现MapReduce的示例代码

    MapReduce是一种备受欢迎的编程模型,它最初由Google开发,用于并行处理大规模数据以提取有价值的信息,本文将使用GO语言实现一个简单的MapReduce,需要的可以参考下
    2023-10-10
  • golang metrics各个指标含义讲解说明

    golang metrics各个指标含义讲解说明

    这篇文章主要为大家介绍了golang metrics各个指标含义讲解说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go errors默认加堆栈信息的作用分析

    Go errors默认加堆栈信息的作用分析

    这篇文章主要为大家介绍了Go errors默认加堆栈信息作用分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 浅谈golang类型断言,失败类型断言返回值问题

    浅谈golang类型断言,失败类型断言返回值问题

    这篇文章主要介绍了浅谈golang类型断言,失败类型断言返回值问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 深入理解gorm如何和数据库建立连接

    深入理解gorm如何和数据库建立连接

    这篇文章主要为大家详细介绍了gorm如何和数据库建立连接,文中的示例代码讲解详细,对我们深入了解GO语言有一定的帮助,需要的小伙伴可以参考下
    2023-11-11
  • Golang测试func TestXX(t *testing.T)的使用详解

    Golang测试func TestXX(t *testing.T)的使用详解

    一般Golang中的测试代码都以xxx_test.go的样式,在命名测试函数的时候以Testxx开头,下面给大家介绍Golang测试func TestXX(t *testing.T)的使用,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Golang操作DuckDB实战案例分享

    Golang操作DuckDB实战案例分享

    DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性,凭借其在以内存为中心的环境中处理高速分析的能力,它迅速受到数据科学家和分析师的欢迎,在这篇博文中,我们将探索在Go中使用DuckDB
    2025-01-01
  • Golang Configor配置文件工具的使用详解

    Golang Configor配置文件工具的使用详解

    Configor是一个支持 yaml、json、toml、shell 的配置文件工具,这篇文中主要为大家详细介绍了Configor的具体使用,感兴趣的小伙伴可以学习一下
    2023-08-08
  • go语言里面实现并发安全扣减库存的几种方式小结

    go语言里面实现并发安全扣减库存的几种方式小结

    本文介绍了GORM框架中的几种高级查询技巧,包括随机返回数据的方法,锁机制的使用,Upsert操作,在gorm-gen中使用原生SQL查询这几种方法,具有一定的参考价值,感兴趣的可以了解一下
    2026-04-04
  • golang中tar压缩和解压文件详情

    golang中tar压缩和解压文件详情

    这篇文章主要给大家介绍golang中tar压缩和解压文件,文章以查看官方文档自带的给大家演习一下golang的archive/tar压缩和解压功能,需要的朋友可以参考一下
    2021-11-11

最新评论