如何通过引用修改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里的两个关键点:
- 切片本身就是引用类型,它指向底层的数组。二维切片本质是「切片的切片」,外层的切片每个元素都是指向一维切片的引用。
- 当你传递
*[][]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
相关产品推荐
相关产品推荐

