全网整合营销服务商

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

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

如何在Golang中实现指针数组排序_自定义排序规则

在Go中对指针数组排序需通过sort.Slice或实现sort.Interface,在比较函数中解引用指针获取值进行比较,须检查nil避免panic,且不可在比较中修改值。

在 Go 中对指针数组排序,本质是对指针所指向的值按自定义规则排序,但操作的是指针本身(即改变指针在切片中的顺序)。关键在于:不能直接对指针解引用后排序,而应通过 sort.Slice 或实现 sort.Interface,并在比较函数中解引用指针来获取排序依据。

使用 sort.Slice 对指针切片排序

这是最常用、最简洁的方式。传入指针切片和一个闭包函数,在函数中对两个指针解引用,比较其值。

例如,对 *int 切片按数值升序排列:

nums := []*int{new(int), new(int), new(int)}
*nums[0] = 5
*nums[1] = 1
*nums[2] = 9

sort.Slice(nums, func(i, j int) bool {
    return *nums[i] < *nums[j] // 解引用比较值
})
// 结果:nums 按 *nums[i] 升序排列:[1, 5, 9]

对结构体指针切片按字段自定义排序

常见场景是排序 []*Person,比如按年龄升序、姓名降序等。只需在比较函数中访问指针字段即可。

示例:按 Age 升序,Age 相同时按 Name 字典序降序:

type Person struct {
    Name string
    Age  int
}

people := []*Person{
    {Name: "Alice", Age: 30},
    {Name: "Bob", Age: 25},
    {Name: "Charlie", Age: 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 // 降序
})

注意空指针与边界安全

指针切片中可能含 nil,解引用前必须检查,否则 panic。

  • 若允许 nil 在前:在比较函数中优先判断 == nil,并约定 nil 视为最小或最大
  • 若业务不允许 nil:排序前过滤,或用 panic/error 明确提示
  • 避免在比较函数中修改指针指向的值,仅用于读取

替代方案:实现 sort.Interface(适合复用)

当同一类型需多种排序逻辑,或希望封装更清晰时,可为指针切片定义新类型并实现接口:

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))

这种方式类型安全更强,也便于单元测试和复用。


# go  # golang  # 排列  # sort  # 封装  # Error  # 结构体  # int  # 指针  # 接口  # Interface  # 闭包  # 空指针  # 切片  # nil  # 升序  # 中对  # 自定义  # 降序  # 复用  # 的是  # 这是  # 只需  # 并在  # 可在 


相关文章: 如何通过IIS搭建网站并配置访问权限?  学校建站服务器如何选型才能满足性能需求?  建站主机选哪种环境更利于SEO优化?  大连网站设计制作招聘信息,大连投诉网站有哪些?  小建面朝正北,A点实际方位是否存在偏差?  如何在橙子建站上传落地页?操作指南详解  Swift中switch语句区间和元组模式匹配  香港服务器如何优化才能显著提升网站加载速度?  浅析上传头像示例及其注意事项  建站之星如何通过成品分离优化网站效率?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何选择高效便捷的WAP商城建站系统?  如何选择建站程序?包含哪些必备功能与类型?  ,sp开头的版面叫什么?  高端企业智能建站程序:SEO优化与响应式模板定制开发  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  如何选择网络建站服务器?高效建站必看指南  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何快速生成专业多端适配建站电话?  外贸公司网站制作哪家好,maersk船公司官网?  如何彻底卸载建站之星软件?  已有域名和空间,如何快速搭建网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  h5在线制作网站电脑版下载,h5网页制作软件?  香港服务器WordPress建站指南:SEO优化与高效部署策略  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  ,购物网站怎么盈利呢?  图册素材网站设计制作软件,图册的导出方式有几种?  如何快速重置建站主机并恢复默认配置?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何用美橙互联一键搭建多站合一网站?  专业商城网站制作公司有哪些,pi商城官网是哪个?  制作旅游网站html,怎样注册旅游网站?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  宿州网站制作公司兴策,安徽省低保查询网站?  ,如何利用word制作宣传手册?  宁波免费建站如何选择可靠模板与平台?  怀化网站制作公司,怀化新生儿上户网上办理流程?  建站之星上传入口如何快速找到?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  代购小票制作网站有哪些,购物小票的简要说明?  如何制作一个表白网站视频,关于勇敢表白的小标题?  建站之星后台密码遗忘如何找回?  如何用PHP快速搭建CMS系统?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  建站之星价格显示格式升级,你的预算足够吗?  如何基于云服务器快速搭建网站及云盘系统? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。