使用sort.Slice可快速对切片自定义排序,如按年龄升序;实现sort.Interface接口适合封装可复用的排序逻辑。

在Go语言中,sort包提供了对切片和自定义数据结构进行排序的实用功能。除了对基本类型(如int、string)排序外,你还可以通过实现自定义排序逻辑来处理复杂结构体或特定排序规则。以下是使用Golang的
sort库进行自定义排序的几种常用方案。
1. 使用 sort.Slice 对切片自定义排序
如果你有一个切片,并希望根据某个条件排序,
sort.Slice是最简单直接的方式。它接受一个切片和一个比较函数。
例如,对一个用户切片按年龄升序排序:
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age // 升序
})
fmt.Println(people)
}
输出结果为按年龄从小到大排序。如果要降序,改为
>即可。
立即学习“go语言免费学习笔记(深入)”;
2. 实现 sort.Interface 接口进行排序
对于更复杂的排序需求,可以定义一个类型并实现
sort.Interface接口的三个方法:
Len()、
Less(i, j)和
Swap(i, j)。
继续以上面的Person为例:
type ByAge []Person
func (a ByAge) Len() int { return len(a) }
func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
// 使用
sort.Sort(ByAge(people))
这种方式适合当你需要多次使用同一种排序规则时,代码更清晰且可复用。
3. 多字段排序(复合排序)
有时需要按多个字段排序,比如先按年龄升序,年龄相同再按姓名字母顺序排序。
使用
sort.Slice可以这样写:
sort.Slice(people, func(i, j int) bool {
if people[i].Age == people[j].Age {
return people[i].Name < people[j].Name
}
return people[i].Age < people[j].Age
})
在
Less方法中也可以做类似判断,实现多级排序逻辑。
4. 反向排序
Go标准库提供了
sort.Reverse包装器,可以轻松实现逆序。
例如,按年龄降序排列:
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
sort.Sort(sort.Reverse(ByAge(people))) // 如果用了Interface方式
或者直接在比较函数中调换比较方向:
sort.Slice(people, func(i, j int) bool {
return people[i].Age > people[j].Age // 降序
})
基本上就这些。使用
sort.Slice适合快速、一次性的排序;实现
sort.Interface适合封装可复用的排序规则。根据实际场景选择合适方式即可。










