Go语言讲解深拷贝与浅拷贝
我们在开发中会经常的把一个变量复制给另一个变量,那么这个过程,可能是深浅拷贝,那么今天帮大家区分一下这两个拷贝的区别和具体的区别。
一、概念
1、深拷贝(Deep Copy):
拷贝的是数据本身,创造一个样的新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值。既然内存地址不同,释放内存地址时,可分别释放。
值类型的数据,默认全部都是深复制,Array、Int、String、Struct、Float,Bool。
2、浅拷贝(Shallow Copy):
拷贝的是数据地址,只复制指向的对象的指针,此时新对象和老对象指向的内存地址是一样的,新对象值修改时老对象也会变化。释放内存地址时,同时释放内存地址。
引用类型的数据,默认全部都是浅复制,Slice,Map。
二、本质区别:
是否真正获取(复制)对象实体,而不是引用。
三、如何理解?
这里举个例子,比如P2复制了P1,修改P1属性的时候,观察P2的属性是否会产生变化
1、P2的属性变化了,说明这是浅拷贝,堆中内存还是同一个值。
p2=&p1 // 浅拷贝,p2为指针,p1和p2共用一个内存地址
2、P2的属性没变化,说明这是深拷贝,堆中内存是不同的值了。
p2=p1 // 深拷贝,生成两个内存地址
四、演示示例:
深拷贝示例:
package mainimport ("fmt"
)// 定义一个Robot结构体
type Robot struct {Name stringColor stringModel string
}func main() {fmt.Println("深拷贝 内容一样,改变其中一个对象的值时,另一个不会变化。")robot1 := Robot{Name: "小白-X型-V1.0",Color: "白色",Model: "小型",}robot2 := robot1fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, &robot2)fmt.Println("修改Robot1的Name属性值")robot1.Name = "小白-X型-V1.1"fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, &robot2)}
运行结果:
深拷贝 内容一样,改变其中一个对象的值时,另一个不会变化。
Robot 1:{小白-X型-V1.0 白色 小型} 内存地址:0xc000072330
Robot 2:{小白-X型-V1.0 白色 小型} 内存地址:0xc000072360
修改Robot1的Name属性值
Robot 1:{小白-X型-V1.1 白色 小型} 内存地址:0xc000072330
Robot 2:{小白-X型-V1.0 白色 小型} 内存地址:0xc000072360
深拷贝中,我们可以看到Robot1号的地址与Robot2号的内存地址是不同的,修改Robot1号的Name属性时,Robot2号不会变化。
浅拷贝我们用两种方式来介绍。
浅拷贝示例1:
package mainimport ("fmt"
)// 定义一个Robot结构体
type Robot struct {Name stringColor stringModel string
}func main() {fmt.Println("浅拷贝 内容和内存地址一样,改变其中一个对象的值时,另一个同时变化。")robot1 := Robot{Name: "小白-X型-V1.0",Color: "白色",Model: "小型",}robot2 := &robot1fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)fmt.Println("在这里面修改Robot1的Name和Color属性")robot1.Name = "小黑-X型-V1.1"robot1.Color = "黑色"fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)}
运行结果1:
浅拷贝 内容和内存地址一样,改变其中一个对象的值时,另一个同时变化。
Robot 1:{小白-X型-V1.0 白色 小型} 内存地址:0xc000062330
Robot 2:&{小白-X型-V1.0 白色 小型} 内存地址:0xc000062330
在这里面修改Robot1的Name和Color属性
Robot 1:{小黑-X型-V1.1 黑色 小型} 内存地址:0xc000062330
Robot 2:&{小黑-X型-V1.1 黑色 小型} 内存地址:0xc000062330
浅拷贝中,我们可以看到Robot1和Robot2的内存地址是相同的,修改其中一个对象的属性时,另一个也会产生变化。
浅拷贝示例2:
package mainimport ("fmt"
)// 定义一个Robot结构体
type Robot struct {Name stringColor stringModel string
}func main() {fmt.Println("浅拷贝 使用new方式")robot1 := new(Robot)robot1.Name = "小白-X型-V1.0"robot1.Color = "白色"robot1.Model = "小型"robot2 := robot1fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)fmt.Println("在这里面修改Robot1的Name和Color属性")robot1.Name = "小蓝-X型-V1.2"robot1.Color = "蓝色"fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)
}
运行结果:
浅拷贝 使用new方式
Robot 1:&{小白-X型-V1.0 白色 小型} 内存地址:0xc000068330
Robot 2:&{小白-X型-V1.0 白色 小型} 内存地址:0xc000068330
在这里面修改Robot1的Name和Color属性
Robot 1:&{小黑-X型-V1.2 黑色 小型} 内存地址:0xc000068330
Robot 2:&{小黑-X型-V1.2 黑色 小型} 内存地址:0xc000068330
new操作,robot2 := robot1,看上去是深拷贝,其实是浅拷贝,robot2和robot1两个指针共用同一个内存地址。
公众号:“跳动的代码”
Go语言讲解深拷贝与浅拷贝相关推荐
- 通俗易懂讲解JavaScript深拷贝和浅拷贝
基本类型和引用类型 在开始讲解JavaScript的深拷贝和浅拷贝之前,先要认识JavaScript的两种基本数据类型.一种是基本类型(值类型),另外一种是引用类型.其中基本类型包括undefined ...
- C语言中的深拷贝和浅拷贝
http://www.cnblogs.com/zhanggaofeng/p/5421804.html C语言中的深拷贝和浅拷贝 //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_N ...
- C 语言结构体成员赋值的深拷贝和浅拷贝
作者 | 李肖遥 责编 | 欧阳姝黎 最近在做通信协议的解析处理.传递分析等问题,总是遇到通信帧中的结构体拷贝等问题,遇到了一些坑,也是比较基础但是易错的C语言知识,一起来探究一下结构体的 ...
- 详细讲解js中的深拷贝与浅拷贝
1 概述 深拷贝与浅拷贝在其它语言中也经常被提及到,在实际项目开发过程中也常常需要区分当前使用的到底是深拷贝还是浅拷贝,有时候在该使用深拷贝的地方,我们使用了浅拷贝,会导致深藏不露的bug. 2 数据 ...
- java 深拷贝_java 深拷贝与浅拷贝机制详解
java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定 ...
- 【Java基础系列教程】第八章 Java面向对象详解(三)_抽象类、接口、内部类、深拷贝与浅拷贝
一.JavaBean规范 1.1 什么是JavaBean JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中.特点是可序列化,提供无参构造器,提供getter方法和 ...
- 面试官:深拷贝与浅拷贝有啥区别?
文章目录 1.前言 2.基本类型的拷贝 3.引用类型的拷贝 3.1 关于引用类型的浅拷贝 3.2 关于引用类型的深拷贝 1.前言 首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在 ...
- C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)
文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...
- C++深拷贝与浅拷贝
浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以 ...
最新文章
- PHP高级编程SPL
- webservice 简介 跨编程语言 跨操作系统 远程调用技术
- 阿里mysql同步工具otter的docker镜像
- Oracle常用操作之登录名和密码大小写问题
- WordPress的body_class()函数详解
- api 微信内置浏览器js_多端开发框架uni-app入坑指南,一套代码适用微信、头条等小程序...
- 无人机集群定位与编队方式研究总结(最详细的鸟群模型分析)
- mybatis13--2级缓存
- 研发体系核心代码和文档安全保护方案
- 第4讲 | 区块链的应用类型
- 备份路由器配置文件到服务器,教你如何备份路由器配置文件
- 将一个基于磁盘的表迁移到SQL Server中的一个内存优化的表
- 【安防百科】视频监控中常用的分辨率
- 配对堆Pairing Heap
- 6成人一个月内就找到工作,期望薪资变高了
- 某大型水压机的驱动系统和控制系统(论文+DWG图纸)
- 一篇文章让你从JAVA零基础入门`OOP`编程12.20
- 男女混浴,有人耍流氓了~~
- GOTURN 网络理解
- AOP到底有啥魅力?《Spring实战》系列 05
热门文章
- object如何转换为int_如何使用Python将语音转换为文本
- 作业帮电脑版在线使用_互助作业帮PC版-互助作业帮电脑版下载 v4.5.8
- Java jni 底层_Java中的native是如何实现的(JNI)
- java面试题二十九 多线程数据共享问题
- oracle pl sql 抛出例外
- 前端开发面试题总结之——JAVASCRIPT.One
- 正经科普:12306能扛得住明星并发出轨级的流量吗?
- sql SERVER 模拟试题
- 《剑指offer》字符流中第一个不重复的字符
- Java程序员谈一谈-----java程序员成长之路