数组是固定长度的值类型,长度是类型的一部分([3]int 和 [4]int 是不同类型),赋值和传参会整体拷贝。切片是对底层数组的引用,由指针、长度 len、容量 cap 三元组构成,赋值只拷贝这个三元组,多个切片可共享同一底层数组。

关键点:数组几乎不直接作为函数参数使用,工程中以切片为主。切片 append 超过 cap 时会重新分配底层数组,此后原切片与新切片不再共享数据,这是常见的坑。截取操作 s[lo:hi] 默认共享底层数组,且 cap 从 lo 算到原数组末尾,可能因 append 覆盖原数据,可用三段切片 s[lo:hi:hi] 限制容量。

arr := [3]int{1, 2, 3}
s := arr[:2]      // 切片共享 arr
s = append(s, 9)  // len 2 < cap 3,直接改写 arr[2]=9
fmt.Println(arr)  // [1 2 9]

追问方向:slice 扩容策略(Go 1.18 后的阈值公式)、nil 切片与空切片的区别。