全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Golang中使用sort对切片排序_自定义排序规则和比较函数

Go中排序有三种方式:sort.Slice适用于快速自定义排序;实现sort.Interface可复用排序逻辑;基本类型可用预置函数如sort.Ints。所有排序均原地修改切片。

在 Go 语言中,sort 包提供了对切片排序的多种方式,既支持内置类型的升序/降序,也支持通过自定义比较逻辑实现灵活排序。关键在于理解 sort.Slicesort.Sort 的使用场景与区别。

用 sort.Slice 实现快速自定义排序

sort.Slice 是最常用、最简洁的方式,适用于大多数自定义排序需求。它接受一个切片和一个匿名函数(比较函数),该函数接收两个索引 ij,返回 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 以复用或封装排序逻辑

当需要多次使用同一排序规则,或想让类型“自带排序能力”时,可为类型实现 sort.Interface 接口(含 Len()Less(i,j int) boolSwap(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小时内与您取得联系。