go数组长度是类型的一部分,声明必须用常量指定,如[5]int与[6]int不兼容;[...]int{1,2,3}可推导长度为[3]int,而[]int是切片;二维数组需写全维度如4int;数组传参为值拷贝,大数组应传指针。

[n]T 是 Go 数组类型的字面量写法,声明时长度和元素类型都必须确定,缺一不可。
数组声明必须显式指定长度
Go 中的数组长度是类型的一部分,[5]int 和 [6]int 是两个完全不兼容的类型。这意味着:
- 不能用变量或运行时计算的值代替长度,比如
var n int = 5; var a [n]int会编译报错 - 长度只能是常量或常量表达式(如
const size = 5或2 + 3) -
var a []int声明的是切片,不是数组;切片没有固定长度,和数组语义完全不同
初始化时省略长度要用 [...] 而不是 []
想让编译器自动推导长度,必须用 [...],不是 []:
- ✅ 正确:
a := [...] int{1, 2, 3}→ 类型是[3]int - ❌ 错误:
a := []int{1, 2, 3}→ 类型是[]int(切片) - ⚠️ 注意:
[...]int{1, 2, 3}中的...只在字面量初始化时有效,不能用于变量声明(如var a [...]int是非法语法)
二维数组声明要写全所有维度长度
二维数组不是“数组的切片”,而是“数组的数组”,每个维度长度都固化在类型里:
- ✅ 正确:
var grid [4][3]int表示 4 行 × 3 列的整型数组 - ❌ 错误:
var grid [4][]int编译失败 —— 第二维度不能是切片 - ⚠️ 初始化嵌套时,每行末尾的逗号不能省(尤其最后一行大括号前):
grid := [2][2]int{{1,2},{3,4},}合法;少逗号会报错
数组传参是值拷贝,大数组要小心性能
因为数组是值类型,函数参数接收的是整个数组的副本:
- 传入一个
[10000]int,就会拷贝 10000 个 int,不是只传指针 - 若只需读/写原数组,应传指针:
func process(arr *[10000]int) - 若长度不固定或需动态扩容,直接用切片更自然:
func process(arr []int)
[3]int{1,2,3} == [3]int{1,2,3} 合法)、栈上分配更可控。但一旦写错长度符号(比如把 [...] 写成 []),得到的就是完全不同的类型,编译器不会帮你隐式转换。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











