Golang切片和数组拷贝详解(浅拷贝和深拷贝)
作者:西京刀客 发布时间:2024-04-26 17:20:38
golang切片和数组拷贝
基础
Go 语言里面变量有两类,一类是值类型,一类是引用类型。
在 Go 语言中:
string、int、bool、float 等这些都属于值类型
slice、map、chan 等这些都属于引用类型
什么是浅拷贝和深拷贝?
我们提到的深拷贝和浅拷贝,则指的是引用类型的值处理方案。
浅拷贝指的是,把变量里面存的内存地址拷贝了,所指向的真实值并没拷贝。
golang数组和切片的区别
1、定义方式不一样
数组定义:
var a1 [3]int
var a2 [...]int{1,2,3}
切片定义
var b1 []int
b2 := make([]int, 3, 5)
2、初始化方法不一样:
数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变。
切片不需要指定大小。切片长度是可以改变。
数组初始化
a := [3]int{1,2,3} //指定长度
a := [...]int{1,2,3} //不指定长度
切片初始化
s := make([]int, 3) //指定长度
s := []int{1,2,3} //不指定长度
3、函数传递方式不同:数组是值传递,切片是地址传递。
数组是值类型,数组传递是值。切片是引用类型,切片传递是指针
4、切片通过append添加元素
数组不能使用append
Golang中的值传递和引用传递
golang默认都是采用值传递,即拷贝传递,也就是深拷贝。 只有一些特定的类型,如slice、map、channel、function、pointer这些天生就是指针的类型,是通过引用传递的。(切片是引用传递,数组是值传递)切片和数组的区别。
总结: 1、golang默认是值传递,即拷贝传递;
2、有些值天生就是指针,如(切片,map类型)
golang数组拷贝
默认情况下Golang的数组传递是值传递,但当我们想要对传入的数组进行修改时,可以使用指针来对数组进行操作,如下:
func main() {
arr := [3]int{1, 2, 3}
arr2 := arr
arr3 := &arr
fmt.Printf("原数组:%v \n", arr)
fmt.Printf("赋值方式复制的数组:%v \n", arr2)
fmt.Printf("引用方式复制的数组:%v \n", *arr3)
arr[1] = 1000
fmt.Printf("改变后原数组:%v \n", arr)
fmt.Printf("改变后赋值方式复制的数组:%v \n", arr2)
fmt.Printf("改变后引用方式复制的数组:%v \n", *arr3)
}
arr2获得的是arr的数据副本,也就是说赋值方式是复制了原数组的底层数据;
而arr3获得的是arr地址的副本,即引用赋值的方式复制的是地址,这个地址指向的还是原来的数据。
golang切片拷贝
copy复制会比等号复制慢。但是copy复制为值复制,改变原切片的值不会影响新切片。而等号复制为指针复制,改变原切片或新切片都会对另一个产生影响。
由于切片是引用类型。但自身是结构体,值拷贝传递。如果直接使用 target:=source 那么操作target也会影响source数值。
target:= make([]int, len(source))
copy(target, source)
数组和切片拷贝总结
针对需要复制拷贝:
如果复制数组,可以直接通过赋值进行复制;
如果复制切片,可以直接使用copy();
来源:https://blog.csdn.net/inthat/article/details/127450453
猜你喜欢
- select语句完整语法:SELECT DISTINCT <select_list>FROM <left_table>
- 给网页添加打印按钮,除了打印之外,还有页面设置、打印预览、复制本文链接到剪贴板等网页基本应用。正象我在图中标注的,大部分按钮只能适用于IE浏
- 说明 1. 状态机是一个非常实用的理论。在涉及到复杂的场景,建立状态机模型,能带来极大的方便。比如,网络连接、模型状态、业务逻辑。
- 在pycharm中我们有时需要切换python的版本,这里需要注意的是我们是在PyCharm中的Preferences中切换的,在File的
- 一、CSRF:保护机制Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csr
- 我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争。你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次
- 摘要:面部识别技术的应用越来越广泛,它广泛应用于安全系统、人机交互、社交媒体、医疗保健等领域。本文介绍了基于Python的人脸识别技术,包括
- PyTorch: https://github.com/shanglianlm0525/PyTorch-Networksimport tor
- 浏览器的出现互联网的出现是人类信息交流方式的一次划时代的革命,在这场革命中有两个技术对互联网的发展起到了决定性的作用:一个技术带来的人类信息
- 返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算。pattern字符串在expression表达式里
- SESSION会话开启时,会首先发送一个对浏览器的唯一标识session_id的cookie(名字为PHPSESSID可以通过session
- var p="",s="4e00"; for( var i=0;i<255;i++){ p+=
- rs.open sql,conn,A,B A: ADOPenforwardonly (=0) 只读,且当前数据记录只能向下移动。 ADOPe
- Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命
- 在平常的一些的小规模的数据的过滤、清洗过程中使用最多的就是正则表达式,但是随着数据规模的增大,正则表达式就显得有些心有余力不足了。正则表达式
- PHP天然就对MySQL有良好的支持,但是想要用PHP对SQL Server进行操作,则需要花点时间了。今天刚好团队里的一个项目需要用PHP
- 但有时候,需要当某事件触发时,我们先做一些操作,然后再跳转,这时,就要用JAVASCRIPT来实现这一跳转功能。 下面是具体的做法: 一:跳
- 1、凸包检测与凸缺陷定义凸包是将最外层的点连接起来构成的凸多边形,它能包含点击中所有的点。物体的凸包检测常应用在物体识别、手势识别及边界检测
- 普通方法:爬取梨视频import reimport timeimport randomimport requestsfrom lxml im
- 今天写了一个获取当前公网ip并且自动断开宽带连接的文件,和大家分享下。这个文件的具体用途大家懂的,可以尽管拿去用,不过目前只适用于Windo