Go 尝试初始化2D切片,但元素引用更改了切片中的所有行
我使用下面的代码创建了一个2D切片。假设我创建了[3]3]片--[1 2 3],[4 5 6][7 8 9]] 但是如果我更新切片,比如s[1][1]=99,所有更改-->[1 993],[4 996],[7 999]] 然而,我在下面用可变成本初始化的第二个片段的行为是正确的。不确定出了什么问题: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
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)
}