vscode Go 编程踩坑日记-二维数组

矩阵在日常开发中用的相当频繁,但是在 golang 中使用二维数组却让我有点意外,如下:

写惯了 java 的我初始化一个二维数组会想当然地这么写:

a := len(grid)
b := len(grid[0])

// 数组长度必须为常量
var dp [a][b]int

这是经典动态规划问题- 最短路径问题 中的一个片段,旨在比较各种编程语言执行相同代码的性能差距。

a, b 为给定路径矩阵 grid 的长宽,这里我要根据给定矩阵初始化动态规划的 二维状态表 dp。

然而极具设计艺术的 golang 编译器是绝对看不上这种代码的:

array length b (variable of type int) must be constant

数组长度必须是一个常量!!!

好吧,奉陪到底:

const a int = len(grid)

还是看不上:

len(grid) (value of type int) is not constant

len(grid) 的返回值不是一个常量!!!

不知道大家有没有注意,目前在 golang 中是没有常量方法一说的,所以要实现 长度以变量的方式初始化二维数组只能求助于切片。

而且代码还是现成的,直接上代码:

// MakeSlice2 创建二维切片
func MakeSlice2(len1, len2 int) [][]int{
	slice2 := make([][]int, len1)
	for i := range slice2 {
		slice2[i] = make([]int, len2)
	}
	return slice2
}

本来想像 java 一样将类型作为参数,用泛型的方式写一个构建二维切片的通用 方法的,make() 函数入参的 [][]int 源码中申明的类型为 builtin.Type,但我以 builtin.Type 作为入参,编译器提示:

t (variable of type builtin.Type) is not a type

哎,脑壳大,希望有大佬点播点播

猜你喜欢

转载自blog.csdn.net/weixin_41346635/article/details/114010127