为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不更改原始阵列的情况下复制阵列?

如何在不更改原始阵列的情况下复制阵列?

Go
月关宝盒 2022-08-15 16:45:20
我想复制一个数组,但复制的数组总是对原始数组进行更改。为什么会这样?下面是该问题的代码示例:package mainimport (    "fmt")func main() {    array := make([]int, 2)    for i := range array {        array[i] = 0    }    oldArray := array    array[0] = 3 // why does this also change oldArray?    oldArray[1] = 2 // why does this also change the original array?    fmt.Println(oldArray, array)    // I expected [0,2], [3,0]    // but it returns [3,2], [3,2]}我之前尝试启动变量,但结果是相同的。oldArrayarray
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

在示例代码中,您使用的是切片,而不是数组。


从切片文档中:


切片是基础数组的连续段的描述符,并提供对该数组中元素的编号序列的访问。


将切片分配给变量时,将创建该描述符的副本,从而处理相同的基础数组。当您实际使用数组时,它具有您期望的行为。


切片文档中的另一个片段(强调我的):


切片一旦初始化,就始终与保存其元素的基础数组相关联。因此,一个切片与其阵列以及同一阵列的其他切片共享存储。相比之下,不同的数组始终表示不同的存储。


下面是一个代码示例(对于切片,第一个元素的内存地址在括号中,以清楚地指出两个切片何时使用相同的基础数组):


package main


import (

    "fmt"

)


func main() {

    // Arrays

    var array [2]int

    newArray := array

    array[0] = 3

    newArray[1] = 2

    fmt.Printf("Arrays:\narray: %v\nnewArray: %v\n\n", array, newArray)


    // Slices (using copy())

    slice := make([]int, 2)

    newSlice := make([]int, len(slice))

    copy(newSlice, slice)

    slice[0] = 3

    newSlice[1] = 2

    fmt.Printf("Slices (different arrays):\nslice (%p): %v \nnewSlice (%p): %v\n\n", slice, slice, newSlice, newSlice)


    // Slices (same underlying array)

    slice2 := make([]int, 2)

    newSlice2 := slice2

    slice2[0] = 3

    newSlice2[1] = 2

    fmt.Printf("Slices (same array):\nslice2 (%p): %v \nnewSlice2 (%p): %v\n\n", slice2, slice2, newSlice2, newSlice2)

}

输出:


Arrays:

array: [3 0]

newArray: [0 2]


Slices (different arrays):

slice (0xc000100040): [3 0] 

newSlice (0xc000100050): [0 2]


Slices (same array):

slice2 (0xc000100080): [3 2] 

newSlice2 (0xc000100080): [3 2]


查看完整回答
反对 回复 2022-08-15
?
暮色呼如

TA贡献1853条经验 获得超9个赞

使用功能。copy

oldArray := make([]int, len(array))
copy(oldArray, array)

https://play.golang.org/p/DsLJ2PDIy_N


查看完整回答
反对 回复 2022-08-15
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号