Go中排序有三种方式:sort.Slice适用于快速自定义排序;实现sort.Interface可复用排序逻辑;基本类型可用预置函数如sort.Ints。所有排序均原地修改切片。
在 Go 语言中,sort 包提供了对切片排序的多种方式,既支持内置类型的升序/降序,也支持通过自定义比较逻辑实现灵活排序。关键在于理解 sort.Slice 和 sort.Sort 的使用场景与区别。
sort.Slice 是最常用、最简洁的方式,适用于大多数自定义排序需求。它接受一个切片和一个匿名函数(比较函数),该函数接收两个索引 i 和 j,返回 true 表示 i 对应元素应排在 j 前面。
例如,对结构体切片按年龄升序、姓名降序排列:
type Person struct {
Name string
Age int
}
people := []Person{{"Alice", 30}, {"Bob", 25}, {"Charlie", 30}}
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 // 同龄时姓名降序
})
当需要多次使用同一排序规则,或想让类型“自带排序能力”时,可为类型实现 sort.Interface 接口(含 Len()、Less(i,j int) bool、Swap(i,j int) 三个方法)。
例如,定义一个按价格降序的 Products 类型:
type Product struct {
Name string
Price float64
}
type ByPrice []Product
func (p ByPrice) Len() int { return len(p) }
func (p ByPrice) Less(i, j int) bool { return p[i].Price > p[j].Price }
func (p ByPrice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
products := []Product{{"A", 99.9}, {"B", 19.5}}
sort.Sort(ByPrice(products))
这样后续只需调用 sort.Sort(ByPrice(s)) 即可复用逻辑。
对于 []int、[]string 等常见类型,sort 包已提供高效且语义清晰的函数:
sort.Ints(s []int) —— 升序sort.Strings(s []string) —— 字典升序sort.Float64s(s []float64) —— 升序(注意 NaN 处理)sort.Sort(sort.Reverse(sort.IntSlice(s))) 或直接用 sort.Slice
例如字符串切片按长度降序:
words := []string{"go", "golang", "hi"}
sort.Slice(words, func(i, j int) bool {
return len(words[i]) > len(words[j])
})
排序操作会**原地修改切片**,不产生新切片;若需保留原数据,请先复制。
比较函数必须满足严格弱序(strict weak ordering):
- 不可同时有 Less(i,j) 和 Less(j,i) 为 true
- 若 Less(i,j) 和 Less(j,k) 为 true,则 Less(i,k) 应为 true
- Less(i,i) 必须为 false
避免在比较函数中做耗时操作(如网络请求、文件读取),否则严重拖慢排序性能。
# word
# go
# golang
# 区别
# 排列
# less
# String
# sort
# 封装
# 字符串
# 结构体
# bool
# int
# 接口
# Interface
# 切片
# len
# 升序
# 自定义
# 降序
# 复用
# 适用于
# 只需
# 请先
# 想让
# 自带
# 排在
相关文章:
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
定制建站方案优化指南:企业官网开发与建站费用解析
建站VPS推荐:2025年高性能服务器配置指南
如何在IIS7中新建站点?详细步骤解析
昆明网站制作哪家好,昆明公租房申请网上登录入口?
手机网站制作与建设方案,手机网站如何建设?
盐城做公司网站,江苏电子版退休证办理流程?
如何零基础开发自助建站系统?完整教程解析
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站之星安装失败:服务器环境不兼容?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用AWS免费套餐快速搭建高效网站?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何选择建站程序?包含哪些必备功能与类型?
建站之星代理如何优化在线客服效率?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何在阿里云域名上完成建站全流程?
如何在云主机快速搭建网站站点?
如何将凡科建站内容保存为本地文件?
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何快速搭建高效服务器建站系统?
建站之星在线客服如何快速接入解答?
如何通过虚拟机搭建网站?详细步骤解析
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何通过VPS搭建网站快速盈利?
网站企业制作流程,用什么语言做企业网站比较好?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何在万网自助建站平台快速创建网站?
简单实现Android验证码
如何通过西部数码建站助手快速创建专业网站?
如何高效完成独享虚拟主机建站?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
宝塔新建站点为何无法访问?如何排查?
微信小程序 input输入框控件详解及实例(多种示例)
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
北京制作网站的公司,北京铁路集团官方网站?
如何在腾讯云免费申请建站?
如何自定义建站之星网站的导航菜单样式?
如何在局域网内绑定自建网站域名?
家具网站制作软件,家具厂怎么跑业务?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
建站与域名管理如何高效结合?
实现虚拟支付需哪些建站技术支撑?
如何通过主机屋免费建站教程十分钟搭建网站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
公众号网站制作网页,微信公众号怎么制作?
*请认真填写需求信息,我们会在24小时内与您取得联系。