Go数组是固定长度、值语义的内存块,声明后不可扩容,赋值传参默认整体拷贝;[3]int与[4]int类型不同;支持直接比较但要求长度和元素完全一致;大数组应传指针避免拷贝;需动态操作时应使用切片。
Go 里的数组不是你习惯的“动态容器”,它是一块固定大小、值语义的内存块——用错场景或误当切片用,性能和逻辑都会出问题。
数组声明后长度不可变,且赋值是整体拷贝
Go 数组的长度是类型的一部分,[3]int 和 [4]int 是完全不同的类型。声明后无法扩容,也不能像切片那样通过 append 增长。
更关键的是:数组变量赋值或传参时默认按值拷贝整块内存:
func process(a [1024]int) { /* 拷贝 1024×8 = 8KB */ }
var x [1024]int
process(x) // 这里发生完整拷贝
- 小数组(如
[2]string、[3]float64)传值没问题,编译器可能优化 - 大数组(≥ 数百元素)务必传指针:
func process(a *[1024]int),避免隐式拷贝 - 如果需要增删元素,直接用
[]T切片,别硬套数组
数组字面量和比较必须严格匹配长度与元素值
数组支持直接比较(==),但要求长度相同、每个位置元素相等。这是编译期确定的行为,和切片不同(切片不能直接比较)。