漫画Go语言中如何将数组切片复制/拷贝

kep-w · · 1008 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

赖思与甜甜,有趣有料有温度,技术学习有思路! Go中的Array数组,是用来存放相同类型元素的固定大小的集合。如何将数组复制到另一个数组呢?看看赖思有何妙招! ![幻灯片1.jpg](https://static.studygolang.com/210406/846de44391a308ea1b901f6859657e86.jpg) ![幻灯片2.jpg](https://static.studygolang.com/210406/760d6c07b5d2b2eb7ce6aa959887cfb7.jpg) ```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) } ``` ![image.png](https://static.studygolang.com/210406/95e0bd3f012b333f17ff8f23692d4231.png) ![幻灯片3.jpg](https://static.studygolang.com/210406/8ca27e3fa4c923c1a28b884a9afff3da.jpg) ```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) } ``` ![image.png](https://static.studygolang.com/210406/93ccdc8cfe5139392f29be4abfb94a33.png) 要理解这个关系很简单,把这段代码画个底层结构图就明白了: ![image.png](https://static.studygolang.com/210406/b8e61c9df38e0268d4d3f49b1660a28b.png) arr2获得的是arr的数据副本,也就是说赋值方式是复制了原数组的底层数据; 而arr3获得的是arr地址的副本,即引用赋值的方式复制的是地址,这个地址指向的还是原来的数据。 所以也就出现了,当arr中原数据被修改,直接赋值而来的数组arr2不受影响,而引用赋值获得的数组arr3也跟着改变了。 另外如果你操作的是切片,那么还真有个内置的方法可以完成复制。 ```golang func main() { arr2 := []int{1, 2, 3} arr3 := []int{4,5,6} fmt.Printf("复制前的数组:%v \n", arr2) copy(arr2, arr3) fmt.Printf("复制后的数组:%v \n", arr2) } ``` 通过copy函数,将底层数据进行了复制替换,所以新的切片也不会受原切片的影响。 **针对复制拷贝总结如下:** 如果复制数组,可以直接通过赋值进行复制; 如果复制切片,可以直接使用copy(); ![幻灯片5.jpg](https://static.studygolang.com/210406/e92230403233add66e6a62d06143941f.jpg) *** 有趣有料有温度,和我一起学技术! 欢迎关注公众号 来思Go,收看更多赖思与甜甜的技术学习日常。 ![qrcode_for_gh_001cc6fab7ac_258 (2).jpg](https://static.studygolang.com/210314/b4fcc0ed2a1e8f4410313c693a9157c2.jpg)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1008 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传