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

无法修改函数中的矩阵

无法修改函数中的矩阵

Go
GCT1015 2022-10-17 16:45:40
我有一个矩阵数组,如果 if 语句为真,我会尝试改变每个矩阵。例如,如果我有这个矩阵:1 2 34 5 67 8 9我想将每个奇数更改为 0。这就是我所拥有的:func main() {    matrices := createMatrix() <-- returns an array of matrices.    for _, matrix := range matrices {        removeOdds(matrix)    }}func removeOdds(mat [][]int) {    for i := 0; i < len(mat); i++ {        for j := 0; j < len(mat[i]); j++ {            if mat[i][j] % 2 != 0 {                mat[i][j] = 0            }        }    }}这是行不通的,因为矩阵没有被改变。我读到 Go 通过值而不是引用传递数组,所以我尝试使用指针。但是,当我在 removeOdds 更改后打印矩阵时,我得到了原始矩阵。这是我写的:func main() {    matrices := createMatrix() <-- returns an array of matrices.    for _, matrix := range matrices {        removeOdds(&matrix)    }}func removeOdds(mat *[][]int) {    for i := 0; i < len(*mat); i++ {        for j := 0; j < len((*mat)[i]); j++ {            if (*mat)[i][j] % 2 != 0 {                (*mat)[i][j] = 0            }        }    }}
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

就我而言,代码片段看起来完全没问题。


需要明确的是, type[]int不是一个数组,它是一个切片。数组是固定长度的数据块,数组的类型签名应该是[3]int. Slice 是一种引用类型,是对真实数据的可变长度视图,意味着它不拥有数据,它只记录在其值中可以在内存中找到数据的位置。


当您将切片传递给函数时,该引用值被复制,即使在函数内部,您仍然引用相同的数据块,或者您可以说底层数组,就像在函数范围之外时一样。


然而,我自己试过你的代码,我写了这个:


type Mat = [][]int


func makeMat() Mat {

    return [][]int{

        {1, 2, 3},

        {4, 5, 6},

        {7, 8, 9},

    }

}


func main() {

    mats := []Mat{}

    for i := 0; i < 10; i++ {

        mats = append(mats, makeMat())

    }

    for _, mat := range mats {

        // no change was made to this function

        removeOdds(mat)

    }

    for _, mat := range mats {

        fmt.Println(mat)

    }


}

输出:


[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

[[0 2 0] [4 0 6] [0 8 0]]

所以我认为你的观察可能有一些错误。也许提供有关您的更多信息createMatrix()。


查看完整回答
反对 回复 2022-10-17
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

除了迭代矩阵之外,您的第一种方法是正确的。你应该使用

for i := range matrices {
        removeOdds(matrix[i])}

代替

for _, matrix := range matrices {
        removeOdds(matrix)}

https://go.dev/play/p/iE0uCE_6Z2v


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信