更改 2D 数组变量也会更改原始 2D 数组变量。为什么?

为什么矩阵也发生了变化?Go 变量按值传递或复制,而不是引用,除非使用指针与值显式指定。有什么我不明白的吗?



import "fmt"


func main() {

    matrix := [][]int{

        {100, 20, 30, 10, 11},

        {15, 100, 16, 4, 2},

        {3, 5, 100, 2, 4},

        {19, 6, 18, 100, 3},

        {16, 4, 7, 16, 100},

    }

    var matrix2 [][]int

    matrix2 = matrix

    matrix2[0][1] = 11111111

    fmt.Println(matrix)

    fmt.Println(matrix2)


    // Output :

    [[100 11111111 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]]

    [[100 11111111 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]]

}


拉莫斯之舞
浏览 92回答 1
1回答

墨色风雨

Go 切片是对基础数组的引用。切片类似于指向值的指针,而不像直接值。如果使用数组而不是切片,您将看到不同的行为:package mainimport "fmt"func main() {    matrix := [5][5]int{        {100, 20, 30, 10, 11},        {15, 100, 16, 4, 2},        {3, 5, 100, 2, 4},        {19, 6, 18, 100, 3},        {16, 4, 7, 16, 100},    }    var matrix2 [5][5]int    matrix2 = matrix    matrix2[0][1] = 11111111    fmt.Println(matrix)    fmt.Println(matrix2)}输出:[[100 20 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]][[100 11111111 30 10 11] [15 100 16 4 2] [3 5 100 2 4] [19 6 18 100 3] [16 4 7 16 100]]你可以看到,因为我使用了数组数组而不是切片,所以赋值复制了整个矩阵。[5][5]int[5]int[][]int[]intmatrix2 = matrix如果要使用可变大小的矩阵,则必须编写自己的函数来创建矩阵副本。仅当您在编译时知道矩阵的大小(例如 5x5)时,上述代码才有效。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go