无法修改函数中的矩阵

我有一个矩阵数组,如果 if 语句为真,我会尝试改变每个矩阵。例如,如果我有这个矩阵:


1 2 3

4 5 6

7 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

            }

        }

    }

}


GCT1015
浏览 86回答 2
2回答

守候你守候我

就我而言,代码片段看起来完全没问题。需要明确的是, type[]int不是一个数组,它是一个切片。数组是固定长度的数据块,数组的类型签名应该是[3]int. Slice 是一种引用类型,是对真实数据的可变长度视图,意味着它不拥有数据,它只记录在其值中可以在内存中找到数据的位置。当您将切片传递给函数时,该引用值被复制,即使在函数内部,您仍然引用相同的数据块,或者您可以说底层数组,就像在函数范围之外时一样。然而,我自己试过你的代码,我写了这个:type Mat = [][]intfunc makeMat() Mat {&nbsp; &nbsp; return [][]int{&nbsp; &nbsp; &nbsp; &nbsp; {1, 2, 3},&nbsp; &nbsp; &nbsp; &nbsp; {4, 5, 6},&nbsp; &nbsp; &nbsp; &nbsp; {7, 8, 9},&nbsp; &nbsp; }}func main() {&nbsp; &nbsp; mats := []Mat{}&nbsp; &nbsp; for i := 0; i < 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; mats = append(mats, makeMat())&nbsp; &nbsp; }&nbsp; &nbsp; for _, mat := range mats {&nbsp; &nbsp; &nbsp; &nbsp; // no change was made to this function&nbsp; &nbsp; &nbsp; &nbsp; removeOdds(mat)&nbsp; &nbsp; }&nbsp; &nbsp; for _, mat := range mats {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(mat)&nbsp; &nbsp; }}输出:[[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()。

慕无忌1623718

除了迭代矩阵之外,您的第一种方法是正确的。你应该使用for&nbsp;i&nbsp;:=&nbsp;range&nbsp;matrices&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeOdds(matrix[i])}代替for&nbsp;_,&nbsp;matrix&nbsp;:=&nbsp;range&nbsp;matrices&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeOdds(matrix)}https://go.dev/play/p/iE0uCE_6Z2v
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go