美文网首页来思Go
漫画Go语言中如何将数组切片复制/拷贝

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

作者: 翱翔的赖思 | 来源:发表于2021-04-06 13:57 被阅读0次

    赖思与甜甜,有趣有料有温度,技术学习有思路!
    Go中的Array数组,是用来存放相同类型元素的固定大小的集合。如何将数组复制到另一个数组呢?看看赖思有何妙招!

    1.jpg
    2.jpg
    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)
    }
    
    3.png
    4.jpg
    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)
    }
    
    5.png

    要理解这个关系很简单,把这段代码画个底层结构图就明白了:

    6.png

    arr2获得的是arr的数据副本,也就是说赋值方式是复制了原数组的底层数据;
    而arr3获得的是arr地址的副本,即引用赋值的方式复制的是地址,这个地址指向的还是原来的数据。
    所以也就出现了,当arr中原数据被修改,直接赋值而来的数组arr2不受影响,而引用赋值获得的数组arr3也跟着改变了。

    另外如果你操作的是切片,那么还真有个内置的方法可以完成复制。

    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();

    7.jpg

    有趣有料有温度,和我一起学技术!
    欢迎留言互动!

    相关文章

      网友评论

        本文标题:漫画Go语言中如何将数组切片复制/拷贝

        本文链接:https://www.haomeiwen.com/subject/gbpfkltx.html