You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过引用修改Go语言中的二维切片?

如何通过引用修改Go语言中的多维切片

嘿,这个问题其实和Go语言里切片的特性以及指针的使用有关,我来一步步给你讲清楚怎么改。

首先,你写的changeMatrixByReference函数里,&matrix[0][0] = 3这种写法是错误的——你不能直接给地址赋值,而且matrix是一个指向二维切片的指针,你得先解引用这个指针才能拿到底层的二维切片,之后再修改元素。

正确的修改方式

你只需要把函数里的代码改成下面这样就行:

func changeMatrixByReference(matrix *[][]int) {
    // 先解引用指针拿到二维切片,再修改指定位置的元素
    (*matrix)[0][0] = 3
}

或者你也可以先把解引用后的切片赋值给一个临时变量,代码会更清晰:

func changeMatrixByReference(matrix *[][]int) {
    m := *matrix // 临时变量存储解引用后的二维切片
    m[0][0] = 3  // 修改元素,因为切片是引用类型,底层数组的变化会反映到原切片上
}

为什么这样可行?

这里要记住Go里的两个关键点:

  1. 切片本身就是引用类型,它指向底层的数组。二维切片本质是「切片的切片」,外层的切片每个元素都是指向一维切片的引用。
  2. 当你传递*[][]int类型的参数时,你拿到的是指向二维切片的指针,必须先解引用(用*操作符)才能访问到切片本身,之后修改切片元素的操作会直接作用到底层数组上,所以原main函数里的matrix会看到变化。

完整的可运行代码

把修改后的代码整合起来就是这样:

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("")
    }
}

运行这段代码,你会看到After部分的输出里matrix[0][0]已经变成3了。

内容的提问来源于stack exchange,提问作者alif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:01:12