Go中二维数组声明语法为行数类型,是编译期定长的“数组的数组”,如var grid 3int表示3个长度为4的[4]int数组,行列顺序不可颠倒,维度必须为常量,与切片[[]]int有本质区别。

Go 里声明二维数组的语法是 [行数][列数]类型
Go 的多维数组是「数组的数组」,必须在编译期确定所有维度的长度,不能像切片那样动态伸缩。比如声明一个 3 行 4 列的整型二维数组,写法是:
var grid [3][4]int注意顺序:最左边的数字是第一维(外层数组长度),往右依次嵌套。它等价于「3 个长度为 4 的
[4]int 数组」。
常见错误包括:
- 把
[3][4]int误写成[4][3]int—— 行列颠倒后索引会越界 - 试图用变量代替维度长度,如
[n][m]int—— 编译失败,数组长度必须是常量表达式 - 混淆数组和切片,写成
[][]int却当成数组用 —— 那其实是切片,零值为nil,直接访问会 panic
初始化二维数组时,大括号嵌套要对齐维度
用字面量初始化时,外层大括号对应第一维,每组内层大括号是一行(即一个子数组)。例如:
a := [2][3]string{<br> {"a", "b", "c"},<br> {"x", "y", "z"},<br>}如果某一行少写一个元素,比如写成 {"a", "b"},编译器会报错 too few values in array literal。也可以只初始化部分元素,未指定的自动为零值,但必须显式写出空的大括号占位,如:b := [2][3]int{<br> {1, 2}, // 第一行:[1 2 0]<br> {}, // 第二行:[0 0 0]<br>}
三维及以上数组只是语法嵌套加深,但实用性很低
声明三维数组就是 [2][3][4]float64,含义是「2 个二维数组,每个是 3×4 的 float64 矩阵」。虽然语法合法,但实际项目中几乎不用:内存占用固定且巨大(比如 [100][100][100]int 占 800KB),无法 resize,传参时还按值拷贝整个结构。遇到需要高维数据的场景,更常用的是嵌套切片(如 [][][]int)或自定义结构体封装索引逻辑。
立即学习“go语言免费学习笔记(深入)”;
如果你看到别人写了 [5][5][5][5]int,大概率是教学示例或极特殊场景;生产代码里该警惕——它很难维护,也容易因栈溢出导致 goroutine crash(数组过大时)。
数组变量名本身不带长度信息,但 len() 和 cap() 行为固定
对二维数组调用 len(a) 返回第一维长度(行数),len(a[0]) 返回第二维长度(列数)。cap() 在数组上永远等于 len(),因为数组容量不可变。这点和切片完全不同——切片的 cap() 可能大于 len(),而数组没有这个弹性。
容易忽略的一点:数组类型包含维度和元素类型,[3][4]int 和 [4][3]int 是两个完全不同的类型,不能互相赋值,哪怕元素数量相同也不行。函数参数若接收 [3][4]int,你就必须传完全匹配的数组,不能“差不多就行”。


















