Go语言标准库sort切片排序:基础类型与自定义结构体
本文详解 Go 语言中 sort 标准库的用法,涵盖基本数据类型(int, float64, string)的快速排序及验证,重点展示如何通过实现 Interface 接口对结构体切片进行自定义规则排序。
sort 标准库概览
sort 标准库为基本数据类型的切片和实现了特定接口的自定义类型提供了便捷的排序功能。常用函数如下表所示:
| 函数 | 描述 |
|---|---|
Ints(x []int) |
对 int 类型的切片进行升序排序 |
IntsAreSorted(x []int) bool |
判断 int 类型的切片是否已经是升序排序 |
Float64s(x []float64) |
对 float64 类型的切片进行升序排序 |
Float64sAreSorted(x []float64) bool |
判断 float64 类型的切片是否已经是升序排序 |
Strings(x []string) |
对 string 类型的切片进行升序排序 |
StringsAreSorted(x []string) bool |
判断 string 类型的切片是否已经是升序排序 |
Sort(data Interface) |
对实现 Interface 接口的自定义类型切片进行排序 |
如需了解更多函数细节,可访问 pkg.go.dev/sort 查阅官方文档。
基本类型排序:Ints 与 IntsAreSorted
Ints(x []int) 接收一个整数切片作为参数,直接修改原切片元素顺序,使其按升序排列。IntsAreSorted(x []int) bool 用于检查切片当前是否已处于升序状态,若满足条件返回 true,否则返回 false。
import (
"fmt"
"sort"
)
func main() {
nums := []int{5, 3, 1, 2, 4, 7}
fmt.Println("排序前:", nums)
fmt.Println("切片是否是升序排序:", sort.IntsAreSorted(nums))
sort.Ints(nums)
fmt.Println("排序后:", nums)
fmt.Println("切片是否是升序排序:", sort.IntsAreSorted(nums))
}执行结果:
排序前: [5 3 1 2 4 7]
切片是否是升序排序: false
排序后: [1 2 3 4 5 7]
切片是否是升序排序: true
浮点数排序:Float64s 与 Float64sAreSorted
Float64s(x []float64) 将浮点切片作为参数,原地改变元素顺序为升序。Float64sAreSorted(x []float64) bool 同样用于校验切片是否已完成升序排序。
import (
"fmt"
"sort"
)
func main() {
nums := []float64{0.0, 1.5, 1.0, 2.4, 4.4, 7.3}
fmt.Println("排序前:", nums)
fmt.Println("切片是否是升序排序:", sort.Float64sAreSorted(nums))
sort.Float64s(nums)
fmt.Println("排序后:", nums)
fmt.Println("切片是否是升序排序:", sort.Float64sAreSorted(nums))
}执行结果:
排序前: [0 1.5 1 2.4 4.4 7.3]
切片是否是升序排序: false
排序后: [0 1 1.5 2.4 4.4 7.3]
切片是否是升序排序: true
字符串排序:Strings 与 StringsAreSorted
Strings(x []string) 对字符串切片进行原地升序排序。注意:StringsAreSorted(x []string) bool 用于验证字符串数组是否已按字典序排好。
import (
"fmt"
"sort"
)
func main() {
strs := []string{"d", "a", "c", "b"}
fmt.Println("排序前:", strs)
fmt.Println("切片是否是升序排序:", sort.StringsAreSorted(strs))
sort.Strings(strs)
fmt.Println("排序后:", strs)
fmt.Println("切片是否是升序排序:", sort.StringsAreSorted(strs))
}执行结果:
排序前: [d a c b]
切片是否是升序排序: false
排序后: [a b c d]
切片是否是升序排序: true
自定义排序:Sort 与 Interface 接口
Sort(data Interface) 函数允许用户对自定义集合类型按特定规则排序。用户必须为待排序的类型实现 sort.Interface 接口。
Interface 接口定义
实现该接口需完成以下三个方法:
Len() int:返回集合的长度。Less(i, j int) bool:i和j为集合中的索引值。该方法返回布尔值,表示索引i处的元素是否应排在索引j之前。若返回false,则说明i不应在j前面。Swap(i, j int):交换索引i和j处元素的值。
对结构体切片进行排序实战
import (
"fmt"
"sort"
)
type User struct {
Name string
Age int
}
type UserSlice []User
// 实现 Len 方法
func (us UserSlice) Len() int {
return len(us)
}
// 实现 Less 方法:按年龄字段进行升序排序
func (us UserSlice) Less(i, j int) bool {
return us[i].Age < us[j].Age
}
// 实现 Swap 方法
func (us UserSlice) Swap(i, j int) {
us[i], us[j] = us[j], us[i]
}
func main() {
us := UserSlice{
User{Name: "小明", Age: 22},
User{Name: "小红", Age: 17},
User{Name: "小花", Age: 18},
}
fmt.Println("排序前:", us)
// 调用 Sort 进行排序
sort.Sort(us)
fmt.Println("排序后:", us)
}执行结果:
排序前: [{小明 22} {小红 17} {小花 18}]
排序后: [{小红 17} {小花 18} {小明 22}]
- 定义
User结构体,并基于[]User自定义UserSlice类型。 - 为
UserSlice实现sort.Interface所需的Len、Less和Swap方法。 Less方法的逻辑为return us[i].Age < us[j].Age,明确指定了按照Age字段进行升序排列的规则。
小结
本文介绍了 Go 语言 sort 包的两种核心应用场景:一是利用 Ints、Float64s 和 Strings 快速处理基本类型切片;二是通过实现 Interface 接口,由开发者自定义比较逻辑(如结构体字段),配合 sort.Sort 完成复杂对象的精准排序。
以上就是 Go语言 sort包使用指南:基本类型与自定义结构体排序 的详细内容,更多关于Go语言 sort包切片排序的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









