猿问

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

我想复制一个数组,但复制的数组总是对原始数组进行更改。为什么会这样?


下面是该问题的代码示例:


package main


import (

    "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


月关宝盒
浏览 127回答 2
2回答

临摹微笑

在示例代码中,您使用的是切片,而不是数组。从切片文档中:切片是基础数组的连续段的描述符,并提供对该数组中元素的编号序列的访问。将切片分配给变量时,将创建该描述符的副本,从而处理相同的基础数组。当您实际使用数组时,它具有您期望的行为。切片文档中的另一个片段(强调我的):切片一旦初始化,就始终与保存其元素的基础数组相关联。因此,一个切片与其阵列以及同一阵列的其他切片共享存储。相比之下,不同的数组始终表示不同的存储。下面是一个代码示例(对于切片,第一个元素的内存地址在括号中,以清楚地指出两个切片何时使用相同的基础数组):package mainimport (    "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]

暮色呼如

使用功能。copyoldArray := make([]int, len(array)) copy(oldArray, array)https://play.golang.org/p/DsLJ2PDIy_N
随时随地看视频慕课网APP

相关分类

Go
我要回答