
Go 支持多种数组声明与初始化方式,包括短变量声明(:=)、带类型 var 声明及复合字面量灵活用法,所有形式在语义上完全等价,可根据可读性与上下文自由选择。
go 支持多种数组声明与初始化方式,包括短变量声明(`:=`)、带类型 `var` 声明及复合字面量灵活用法,所有形式在语义上完全等价,可根据可读性与上下文自由选择。
在 Go 中,数组是值类型且长度固定,其初始化既可显式指定类型,也可依赖类型推导。核心原则是:只要类型明确、初始化表达式合法,不同语法形式语义一致。
以下六种写法均声明并初始化一个包含三个整数的数组 [3]int,值为 {369, 0, 963}:
a := [3]int{369, 0, 963} // 短变量声明(最常用)
b := [...]int{369, 0, 963} // 省略长度,编译器自动推导为 [3]int
var c = [3]int{369, 0, 963} // var 声明 + 类型推导
var d [3]int = [3]int{369, 0, 963} // var 声明 + 显式类型 + 显式复合字面量
var e [3]int = [...]int{369, 0, 963} // var 声明 + 显式类型 + 推导长度字面量
var f = [...]int{369, 0, 963} // var 声明 + 完全推导(类型+长度)✅ 所有上述变量 a–f 的类型均为 [3]int,内存布局与行为完全相同。
此外,Go 的复合字面量支持键控初始化(keyed initialization),允许跳过中间元素或按索引赋值。例如:
g := [3]int{369, 2: 963} // 等价于 [3]int{369, 0, 963};索引 1 未指定 → 自动填充零值 int(0)
h := [...]int{369, 2: 963} // 同样推导为 [3]int此处 2: 963 明确将值 963 赋给索引 2 的元素,索引 0 为 369,索引 1 因未指定而采用 int 的零值 0。
⚠️ 注意事项:
- 数组长度是类型的一部分,[3]int 和 [4]int 是完全不同类型,不可互赋;
- 使用 ... 仅在复合字面量中有效(如 [...]int{}),表示由元素个数自动确定长度,但声明后仍为固定长度数组;
- 若使用 var x [N]T 但不提供初始化器(即无 = ...),则变量被零值初始化(如 [3]int{0, 0, 0});
- 混合键控与非键控写法时,未键控元素按顺序填充空缺索引(规则见语言规范:Composite literals)。
综上,Go 并非“只支持短变量声明”,而是提供了丰富、正交且语义一致的初始化语法。开发者应根据场景选择:局部简洁用 :=,包级变量或需显式类型提示时用 var,需动态推导长度时用 [...]T,需稀疏初始化时用键控语法。

















