
Go 的 sort.Ints() 函数仅接受 []int 类型切片,不支持直接传入固定长度数组(如 [5]int);需通过切片语法 arr[:] 将数组转换为底层数组相同的切片后调用。
go 的 `sort.ints()` 函数仅接受 `[]int` 类型切片,不支持直接传入固定长度数组(如 `[5]int`);需通过切片语法 `arr[:]` 将数组转换为底层数组相同的切片后调用。
在 Go 语言中,数组([N]T)和切片([]T)是两种不同的类型,具有本质区别:数组是值类型,长度固定且属于类型的一部分;而切片是引用类型,底层指向数组,具备动态长度特性。标准库的 sort 包所有排序函数(如 sort.Ints、sort.Float64s、sort.Strings)均设计为操作切片,而非数组。
因此,当你声明 var arr [5]int 后,arr 是一个 [5]int 类型的数组,直接传给 sort.Ints(arr) 会导致编译错误:
cannot use arr (type [5]int) as type []int in argument to sort.Ints
✅ 正确做法是使用切片表达式 arr[:] —— 它会创建一个引用该数组全部元素的切片,类型为 []int,长度和容量均为 5,完全满足 sort.Ints 的参数要求。
以下是修正后的完整可运行示例:
package main
import (
"fmt"
"sort"
)
func main() {
var arr [5]int
fmt.Println("Enter 5 elements:")
for i := 0; i <p>⚠️ 注意事项:</p>
- arr[:] 不会复制数据,而是共享原数组底层数组,因此排序会直接影响原数组内容;
- 若后续需保留原始顺序,应先拷贝:slice := append([]int(nil), arr[:]...) 或使用 copy();
- 对于动态长度需求,推荐直接使用切片声明(如 arr := make([]int, 5)),避免数组/切片类型混淆;
- sort.Ints 使用优化的内省排序(introsort),时间复杂度为 O(n log n),稳定高效。
总结:Go 强调类型精确性,理解数组与切片的差异是写出正确、高效代码的基础。记住口诀——“sort 只认切片,数组须加 [:]”。











