Golang深拷贝实现 值类型与指针类型区别

深拷贝需复制所有层级数据避免共享,Go中通过手动实现、gob序列化或第三方库完成,值类型直接赋值,引用类型需递归复制。

golang深拷贝实现 值类型与指针类型区别

在Go语言中,深拷贝是指创建一个新对象,其字段值与原对象完全相同,但彼此之间不共享内存地址。这对于包含指针或引用类型(如切片、map、指针结构体字段)的结构体尤为重要。理解值类型与指针类型在深拷贝中的行为差异,是正确实现拷贝逻辑的关键。

值类型与指针类型的基本区别

Go中的类型可分为值类型和指针类型:

值类型:包括int、float、bool、string、数组、结构体(字段均为值类型)等。赋值时会复制整个数据,两个变量互不影响。 指针类型:指向内存地址。赋值时复制的是地址,多个变量可能指向同一块内存,修改会影响所有引用者。

例如:

type Person struct {
  Name string
  Age  int
}

p1 := Person{“Alice”, 30}
p2 := p1  // 值拷贝,p2是独立副本
p2.Name = “Bob”
// p1.Name 仍是 “Alice”

但如果结构体中包含指针:

立即学习“go语言免费学习笔记(深入)”;

type Person struct {
  Name *string
  Data []int
}

name := “Alice”
p1 := Person{&name, []int{1,2}}
p2 := p1  // 浅拷贝,指针字段共享
*p2.Name = “Bob”
// p1.Name 也变成 “Bob”

如何实现深拷贝

深拷贝需要递归复制所有层级的数据,确保没有共享引用。常见方法有:

手动实现:适用于结构清晰的小对象。

func (p *Person) DeepCopy() *Person {
  var nameCopy string
  if p.Name != nil {
    nameCopy = *p.Name
  }
  dataCopy := make([]int, len(p.Data))
  copy(dataCopy, p.Data)
  return &Person{
    Name: &nameCopy,
    Data: dataCopy,
  }
}

使用 encoding/gob 序列化:通用但性能较低,需注册复杂类型。

import “bytes”
import “encoding/gob”

func DeepCopy(src, dst interface{}) error {
  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)
  dec := gob.NewDecoder(&buf)
  if err := enc.Encode(src); err != nil {
    return err
  }
  return dec.Decode(dst)
}

使用第三方库(如 copier、deepcopy-go):简化代码,支持结构体、slice、map等。

值类型字段自动深拷贝,指针字段需特别处理

当结构体字段是值类型(如int、string、数组),直接赋值即完成深拷贝。但若字段是指针、slice、map等引用类型,必须显式复制底层数据。

slice:使用 make + copy map:遍历并重新赋值 指针:分配新内存并复制内容 嵌套结构体:递归调用 DeepCopy 方法

注意:Go不支持运算符重载,也无法像C++那样定义拷贝构造函数,因此深拷贝需手动或通过工具实现。

基本上就这些。掌握值类型与指针类型的拷贝行为,能避免共享状态引发的bug,尤其在并发或需要保留原始数据的场景中尤为重要。

以上就是Golang深拷贝实现 值类型与指针类型区别的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1401057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
怎样使用Golang构建建造者模式 分步创建复杂对象实例
上一篇 2025年12月15日 17:30:37
如何在Fly.io云平台部署Golang 配置边缘计算应用的发布流程
下一篇 2025年12月15日 17:30:54

相关推荐

  • win10系统窗口边框消失_win10界面显示异常的修复技巧

    win10系统窗口边框消失_win10界面显示异常的修复技巧win10系统窗口边框消失_win10界面显示异常的修复技巧win10系统窗口边框消失_win10界面显示异常的修复技巧win10系统窗口边框消失_win10界面显示异常的修复技巧

    窗口边框消失可通过更新驱动、检查个性化设置、修复系统文件等方法解决。①更新或回滚显卡驱动:进入设备管理器,右键显卡选择更新或回滚驱动;②检查个性化设置:确保“标题栏和窗口边框”选项已勾选,尝试关闭透明效果;③运行sfc /scannow命令修复系统文件;④修改注册表:确认colorprevalenc…

    2026年8月28日 用户投稿
    200
  • 在 Yii 项目里,数据库迁移工具怎么正确使用?

    在 yii 项目中使用数据库迁移工具的步骤包括:1. 创建迁移文件,使用 yii migrate/create 命令;2. 应用迁移,使用 yii migrate 命令;3. 回滚迁移,使用 yii migrate/down 命令。通过这些步骤,你可以管理数据库结构变更,确保开发、测试和生产环境的一…

    2026年8月28日
    000
  • 云上书阁app缓存文件如何清理_云上书阁app释放手机存储空间

    云上书阁app缓存文件如何清理_云上书阁app释放手机存储空间云上书阁app缓存文件如何清理_云上书阁app释放手机存储空间云上书阁app缓存文件如何清理_云上书阁app释放手机存储空间云上书阁app缓存文件如何清理_云上书阁app释放手机存储空间

    云上书阁App占用过多存储空间可通过四种方法清理:1. 在App内“我的”-“设置”中选择“清除缓存”;2. 进入手机系统设置-应用管理-云上书阁-存储,清除缓存或删除数据;3. 使用手机管家类工具扫描并批量清理应用缓存;4. 手动进入书架页面删除已下载的离线书籍文件以释放空间。 如果您发现云上书阁…

    2026年8月28日 用户投稿
    000
  • 内网横向移动:Kerberos认证与(哈希)票据传递攻击

    在上一节《内网横向移动:获取域内单机密码与hash》中,我们探讨了如何在内网渗透中获取主机的密码和哈希值。获取哈希后,我们可以尝试破解,如果破解失败,我们可以利用这些哈希通过pth、ptt等攻击方式继续进行内网的横向渗透,这就是我们接下来要讨论的内容。 本节,我们将详细讲解横向渗透中的Kerbero…

    2026年8月28日
    000
  • 如何解决文件签名验证问题?使用Composer安装roave/signature库来实现!

    可以通过以下地址学习 Composer:学习地址 在开发过程中,我遇到了一个棘手的问题:如何确保文件内容的完整性和真实性?这在软件发布、代码审查和数据传输等场景中尤为重要。最初,我尝试使用自定义的解决方案来实现文件签名和验证,但这些方法在处理大文件和复杂场景时效率低下且不稳定。 经过一番研究,我找到…

    用户投稿 2026年8月28日
    100
  • EyeCare护眼工具怎么处理软件冲突_EyeCare护眼工具软件冲突处理步骤详解

    首先关闭冲突软件并调整启动项,通过禁用非必要色彩管理软件的自启动避免资源抢占;接着修改软件默认配置,统一色温标准为sRGB以实现兼容;若问题仍存,则进入安全模式彻底卸载冲突程序,确保EyeCare护眼工具稳定运行。 如果您在使用EyeCare护眼工具时遇到屏幕色阶频繁变化、功能失效或与其他色彩管理软…

    2026年8月28日
    100
  • kernel32.dll下载与安装指南 快速解决DLL缺失问题

    kernel32.dll下载与安装指南 快速解决DLL缺失问题kernel32.dll下载与安装指南 快速解决DLL缺失问题kernel32.dll下载与安装指南 快速解决DLL缺失问题kernel32.dll下载与安装指南 快速解决DLL缺失问题

    在使用windows操作系统时,有些用户可能会碰到程序启动时报错“无法找到kernel32.dll”或提示“kernel32.dll文件丢失”的问题。这类错误通常由系统文件损坏、病毒入侵或软件之间的冲突引起。下面为大家整理了几种有效的修复方法,一起来看看如何解决! 方法1:利用系统内置工具进行修复 …

    2026年8月28日 用户投稿
    000
  • 电脑如何截屏截长图

    通过截长图的方式,我们能够轻松地将整个网页的内容完整地保存下来,而无需手动拼接多张图片。只需简单几步,就能让电脑自动完成长截图的过程。接下来就跟着小编一起学习如何操作吧! 1、利用QQ截长图:首先打开电脑上的QQ客户端,按下组合键【Ctrl+Alt+A】激活截图工具。然后用鼠标框选出想要截取的部分,…

    2026年8月28日
    200
  • Yii 中如何优化数据库查询提升系统性能?

    在 yii 中优化数据库查询的方法包括:1)使用 with() 方法进行预加载,2)使用 joinwith() 方法进行连接查询优化,3)建立索引,4)分页查询,5)缓存查询结果,6)避免 n+1 查询问题。这些方法能有效提升系统性能。 引言 在开发过程中,数据库查询的性能往往是系统瓶颈之一,尤其是…

    2026年8月28日
    200
  • 怎么清理注册表 注册表清理教程

    怎么清理注册表 注册表清理教程怎么清理注册表 注册表清理教程怎么清理注册表 注册表清理教程怎么清理注册表 注册表清理教程

    电脑注册表存储着操作系统及各类软件的重要配置数据。随着使用时间增长,注册表中会不断积累无效条目、错误信息和冗余内容,这不仅可能拖慢系统运行速度,还可能导致程序异常或系统不稳定。本文将为你详细介绍如何安全高效地清理注册表,让你轻松完成系统优化。 一、注册表清理的意义 定期清理注册表对维护系统健康具有重…

    2026年8月28日 用户投稿
    300
  • 如何解决PHP中生成随机内容的问题?使用pragmarx/random库可以!

    可以通过一下地址学习composer:学习地址 在开发一个php项目时,我需要生成各种随机内容,包括字符串、数字和符合特定模式的文本。这个需求看似简单,但实际上却充满了挑战。最初,我尝试使用php的内置函数如rand()和mt_rand(),但这些函数生成的随机数不够安全,无法满足我的需求。此外,我…

    用户投稿 2026年8月28日
    100
  • Workerman 服务器 CPU 使用率过高,怎么进行性能调优?

    要降低 workerman 服务器的 cpu 使用率,可以采取以下措施:1. 简化业务逻辑,减少不必要的计算和 i/o 操作。2. 使用异步处理,将耗时任务放到异步队列中。3. 实施缓存机制,减少数据库查询次数。4. 配置负载均衡,避免单台服务器过载。通过这些方法,可以有效降低 cpu 使用率,提升…

    2026年8月28日
    100
  • 内存条接触不良导致的电脑死机蓝屏故障排查步骤

    内存条接触不良导致的电脑死机蓝屏故障排查步骤内存条接触不良导致的电脑死机蓝屏故障排查步骤内存条接触不良导致的电脑死机蓝屏故障排查步骤内存条接触不良导致的电脑死机蓝屏故障排查步骤

    内存条接触不良会导致蓝屏死机,是因为数据传输不稳定触发系统保护机制;解决步骤为:1.断电并打开机箱侧盖;2.取下内存条并清洁金手指和插槽;3.重新安装内存条并逐一测试;4.尝试更换插槽位置;5.使用memtest86检测硬件错误。其他常见蓝屏原因包括驱动问题、硬盘故障、过热、系统文件损坏及电源不稳定…

    2026年8月28日 用户投稿
    300
  • 抖音粉丝怎么增加点赞?抖音如何快速增加粉丝

    抖音作为当下炙手可热的短视频平台,吸引了无数用户的目光。要想在这个平台上脱颖而出,不仅需要吸引更多的粉丝,还需要提高视频的点赞量。本文将从多个方面分享抖音粉丝增长与点赞提升的实用技巧,助你轻松成为抖音达人! 一、优质内容是核心竞争力 明确定位:明确自己的兴趣方向,专注于某一领域,如美妆、健身、旅行等…

    2026年8月28日
    100
  • 如何解决FTP文件管理的复杂性?使用nicolab/php-ftp-client库可以!

    可以通过一下地址学习composer:学习地址 在处理php项目时,我经常需要与ftp服务器进行交互,包括上传、下载、删除文件和目录等操作。最初,我尝试手动编写这些功能,但很快就发现这不仅耗时,而且容易出错。每次需要处理不同的ftp命令时,都要查阅文档,写出复杂的代码,实在是让人头疼。 后来,我发现…

    用户投稿 2026年8月28日
    100
  • 抖音探店怎么开通?新手探店达人怎么做

    抖音已成为众多用户分享生活、展现才艺的重要平台。其中,抖音探店功能凭借其独特的魅力,深受美食爱好者的追捧。那么,如何开通抖音探店功能呢?接下来,本文将为您详细解析抖音探店开通的具体流程,助您踏上美食分享之路。 探店功能概览 抖音探店是抖音专为美食爱好者设计的功能,用户可通过录制美食视频来分享个人的美…

    2026年8月28日
    100
  • ThinkPHP 日志管理与错误监控(Sentry集成)

    在thinkphp中实现高效的日志管理和错误监控可以通过以下步骤实现:1)配置thinkphp的log.php文件,定义日志类型、存储路径和记录级别;2)通过composer.json安装sentry sdk,并在应用中初始化sentry,设置dsn以捕获和发送异常到sentry服务器;3)使用th…

    2026年8月28日
    100
  • win7电脑开机出现BOOTMGR is compressed错误

    win7电脑开机出现BOOTMGR is compressed错误win7电脑开机出现BOOTMGR is compressed错误win7电脑开机出现BOOTMGR is compressed错误win7电脑开机出现BOOTMGR is compressed错误

    windows 7出现“bootmgr is compressed”错误时,需通过windows pe系统取消bootmgr文件的压缩或重建启动项。1.使用pe系统启动并找到系统盘;2.取消bootmgr文件的压缩属性;3.若无效则用启动修复工具(如ntbootautofix)修复启动项;4.仍无效…

    2026年8月28日 用户投稿
    200
  • 为什么 Laravel 依然是 PHP 开发者的首选框架?

    laravel 依然是 php 开发者的首选框架,因为它在开发体验、社区支持和生态系统上表现卓越。1) 其优雅的语法和丰富的功能集,如 eloquent orm 和 blade 模板引擎,提升了开发效率和代码可读性。2) 庞大的社区提供了丰富的资源和支持。3) 尽管学习曲线较陡且可能导致项目复杂性增…

    2026年8月28日
    100
  • 抖音怎么店铺定位?抖音如何添加门店地址

    随着越来越多的商家入驻抖音平台,如何在激烈的市场竞争中脱颖而出,精准定位店铺并吸引目标客户群,已成为商家关注的重点。本文将从客户需求分析、内容制作及优化、运营策略等方面,为商家提供抖音店铺定位的全面指南,助力打造畅销商品。 1、立即进入“Tiktok国际版在线网址入口☜☜☜☜☜点击进入”; 2、立即…

    2026年8月28日
    200

发表回复

登录后才能评论
关注微信