dongshuo9350 2019-06-09 08:05
浏览 21
已采纳

通过参考传递和修改2D切片

I'm having difficulty figuring out how to change a multidimensional slice by reference.

func main() {

    matrix := [][]int{
        {1, 0, 0},
        {1, 0, 0},
        {0, 1, 1},
    }
    fmt.Println("Before")
    printMatrix(matrix)
    changeMatrixByReference(&matrix)

    fmt.Println("After")
    printMatrix(matrix)
}

func changeMatrixByReference(matrix *[][]int) {
    //&matrix[0][0] = 3
}

func printMatrix(matrix [][]int) {
    for i := 0; i < len(matrix); i++ {
        for j := 0; j < len(matrix[0]); j++ {
            fmt.Printf("%d", matrix[i][j])
        }
        fmt.Println("")
    }
}

How can I change the matrix 2d slice inside the function changeMatrixByReference? I expect when printMatrix runs the second time matrix[0][0] becomes 3.

  • 写回答

1条回答 默认 最新

  • dsa88886666 2019-06-09 08:37
    关注

    To set matrix[0][0] to 3, using pointer dereferencing:

    (*matrix)[0][0] = 3
    

    Try this:

    package main
    
    import "fmt"
    
    func main() {
    
        matrix := [][]int{
            {1, 0, 0},
            {1, 0, 0},
            {0, 1, 1},
        }
        fmt.Println("Before")
        printMatrix(matrix)
        changeMatrixByReference(&matrix)
    
        fmt.Println("After")
        printMatrix(matrix)
    }
    
    func changeMatrixByReference(matrix *[][]int) {
        (*matrix)[0][0] = 3
    }
    
    func printMatrix(matrix [][]int) {
        for i := 0; i < len(matrix); i++ {
            for j := 0; j < len(matrix[0]); j++ {
                fmt.Printf("%d", matrix[i][j])
            }
            fmt.Println("")
        }
    }
    
    

    You don't need a pointer to change an element of an underlying array of a slice:
    Try this:

    package main
    
    import "fmt"
    
    func main() {
    
        matrix := [][]int{
            {1, 0, 0},
            {1, 0, 0},
            {0, 1, 1},
        }
        fmt.Println("Before")
        printMatrix(matrix)
        changeMatrixByReference(matrix)
    
        fmt.Println("After")
        printMatrix(matrix)
    }
    
    func changeMatrixByReference(matrix [][]int) {
        matrix[0][0] = 3
    }
    
    func printMatrix(matrix [][]int) {
        for i := 0; i < len(matrix); i++ {
            for j := 0; j < len(matrix[0]); j++ {
                fmt.Printf("%d", matrix[i][j])
            }
            fmt.Println("")
        }
    }
    

    Output:

    Before
    100
    100
    011
    After
    300
    100
    011
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?