在Go语言中,切片排序主要通过标准库 sort 包实现。以下是常用技巧:
1. 基本排序
- 升序排序:使用
sort.Slice 或 sort.Ints、sort.Strings 等。
- 降序排序:通过自定义
Less 函数反转比较逻辑。
示例代码:
package main
import (
"fmt"
"sort"
)
func main() {
// 整数切片排序
nums := []int{3, 1, 4, 1, 5, 9, 2}
sort.Ints(nums) // 升序
fmt.Println("升序:", nums) // [1 1 2 3 4 5 9]
// 降序:使用 sort.Slice
sort.Slice(nums, func(i, j int) bool {
return nums[i] > nums[j] // 降序规则
})
fmt.Println("降序:", nums) // [9 5 4 3 2 1 1]
// 字符串切片排序
strs := []string{"banana", "apple", "cherry"}
sort.Strings(strs) // 按字典序升序
fmt.Println("字符串升序:", strs) // [apple banana cherry]
}
2. 自定义结构体排序
对结构体切片按特定字段排序:
type Person struct {
Name string
Age int
}
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
// 按 Age 升序
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
fmt.Println(people) // [{Bob 25} {Alice 30} {Charlie 35}]
3. 稳定排序
使用 sort.SliceStable 保持相等元素的原始顺序:
items := []struct {
Name string
Grade int
}{
{"Alice", 90},
{"Bob", 85},
{"Charlie", 90},
}
// 按 Grade 升序,相同 Grade 保持原顺序
sort.SliceStable(items, func(i, j int) bool {
return items[i].Grade < items[j].Grade
})
// 结果:Bob(85), Alice(90), Charlie(90) 顺序不变
4. 性能优化
- 对基本类型切片(如
[]int)优先使用 sort.Ints,比 sort.Slice 更高效。
- 避免在循环中重复创建切片,尽量复用。
5. 复杂排序规则
多字段排序(例如先按年龄升序,再按姓名降序):
sort.Slice(people, func(i, j int) bool {
if people[i].Age != people[j].Age {
return people[i].Age < people[j].Age
}
return people[i].Name > people[j].Name // 姓名降序
})
总结:
Go的 sort 包提供了灵活且高效的切片排序方法,通过自定义比较函数可实现任意复杂度的排序需求。