
go 语言中数组长度固定不可扩展,而切片是动态的引用类型;向可变参数函数传入数组需显式切片转换(如 arr[:]),否则类型不匹配会编译失败。
go 语言中数组长度固定不可扩展,而切片是动态的引用类型;向可变参数函数传入数组需显式切片转换(如 arr[:]),否则类型不匹配会编译失败。
在 Go 语言中,[n]T(如 [3]int)是数组(array),属于值类型,其长度是类型的一部分,编译期即确定且不可更改。而 []T(如 []int)是切片(slice),是引用类型,底层指向一个数组,具备动态长度特性,支持追加(append)、切片操作等。
上述代码中,arr0 是切片字面量,天然支持 ... 展开;arr1 是数组,但通过 arr1[:] 转换为切片后即可传递;而 arr2 是同类型的数组,却直接使用 arr2... —— 这会导致编译错误:cannot use arr2 (type [3]int) as type []int,因为 Go 不允许隐式数组到切片的转换,即使长度匹配。
✅ 正确做法是显式切片操作:
add(arr2[:]...) // 将 [3]int 转为 []int,底层数组不变,零拷贝
⚠️ 注意事项:
-
arr[:]创建的是对原数组的视图,修改切片元素会同步影响原数组; - 若需独立副本,应使用
append([]int(nil), arr2...)或s := make([]int, len(arr2)); copy(s, arr2); - 数组越界访问(如
arr2[3] = 3)在编译期即报错(index out of bounds),Go 的数组安全性远高于 C。
总结:Go 严格区分数组与切片。数组用于已知固定大小、强调内存布局或性能敏感场景;日常开发应优先使用切片。当必须传数组给 ...T 函数时,牢记 arr[:] 是标准、高效且安全的转换方式。

















