Go 尝试初始化2D切片,但元素引用更改了切片中的所有行

Go 尝试初始化2D切片,但元素引用更改了切片中的所有行,go,multidimensional-array,Go,Multidimensional Array,我使用下面的代码创建了一个2D切片。假设我创建了[3]3]片--[1 2 3],[4 5 6][7 8 9]] 但是如果我更新切片,比如s[1][1]=99,所有更改-->[1 993],[4 996],[7 999]] 然而,我在下面用可变成本初始化的第二个片段的行为是正确的。不确定出了什么问题: func CreateSparseM() *SparseM{ var m,n,nz int fmt.Println("Enter the row count of matrix

我使用下面的代码创建了一个2D切片。假设我创建了[3]3]片--[1 2 3],[4 5 6][7 8 9]] 但是如果我更新切片,比如s[1][1]=99,所有更改-->[1 993],[4 996],[7 999]]

然而,我在下面用可变成本初始化的第二个片段的行为是正确的。不确定出了什么问题:


func CreateSparseM()  *SparseM{
    var m,n,nz int
    fmt.Println("Enter the row count of matrix ")
    fmt.Scan(&m)
    fmt.Println("Enter the column count of matrix ")
    fmt.Scan(&n)
    fmt.Println("Enter the count of Non Zero elements in the matrix ")
    fmt.Scan(&nz)
    r:=make([][]int,m)
    c:=make([]int,n)
    for i:=0;i<m;i++{
        r[i] =  c
    }
    fmt.Println(" r ", r)
    r[1][1] = 99
    fmt.Println(r[1][1])
    fmt.Println(r[0][1])
    //enter the non-zero elements
    var row,col,elem int
    for i:=0;i<nz;i++{
        fmt.Println("Enter row ")
        fmt.Scan(&row)
        fmt.Println("Enter col ")
        fmt.Scan(&col)
        fmt.Println("Enter element ")
        fmt.Scan(&elem)
        r[row][col] = elem
    }
    fmt.Println(r)

    cost:= [][]int{ {1,1,2,2,3,4,4,5,5},
        {2,6,3,7,4,5,7,6,7},
        {25,5,12,10,8,16,14,20,18}}

    fmt.Println(cost)
    cost[1][2]= 777

    fmt.Println(cost)
    sparseM := &SparseM{m,n,nz,r}
    return sparseM
}

func CreateSparseM()*SparseM{
变量m,n,nz int
fmt.Println(“输入矩阵的行数”)
fmt.扫描(&m)
fmt.Println(“输入矩阵的列计数”)
格式扫描(&n)
fmt.Println(“在矩阵中输入非零元素的计数”)
格式扫描(&N)
r:=make([]int,m)
c:=make([]整数,n)

对于i:=0;i切片包含对数组的引用、容量和切片的长度。因此以下代码:

r:=make([][]int,m)
c:=make([]int,n)
for i:=0;i<m;i++{
   r[i] =  c
}

那么第一种情况下你也会有不同的切片。

Go中没有2D切片。你能得到的最接近的切片是一片切片(或一组切片)@peterSO:这不是我刚才说的吗?:)谢谢……是的,这是关键,切片是指针,因此使用make()inslde循环将执行此操作,否则所有行都指向同一个切片。
for i:=0;i<m;i++{
   r[i] =  make([]int,n)
}