如何使用Golang实现排序_Golang sort包排序方法示例
发布时间 - 2026-02-03 00:00:00 点击率:次Go sort包不支持自动推断类型排序,需用sort.Ints/sort.Strings等专用函数排基础类型,或实现sort.Interface接口排自定义类型;所有排序原地进行、稳定、时间复杂度O(n log n)。
Go 标准库的 sort 包不提供“自动推断类型并排序”的泛型接口(在 Go 1.21 之前),所以不能像 Python 的 sorted() 那样直接传任意切片。必须明确类型、实现 sort.Interface,或使用预定义的快捷函数。
用 sort.Ints / sort.Strings 快速排基础类型切片
这是最常用也最安全的方式:针对 []int、[]string、[]float64 等内置类型,sort 包提供了专用函数,内部已封装好比较逻辑,无需手动实现接口。
-
sort.Ints只接受[]int,对[]int64或自定义整数别名会编译报错 - 所有快捷函数都是原地排序(修改原切片),不返回新切片
- 时间复杂度稳定为 O(n log n),底层是优化过的 pdqsort(混合快排/堆排/插入排序)
package main
import (
"fmt"
"sort"
)
func main() {
nums := []int{3, 1, 4, 1, 5}
sort.Ints(nums) // 直接修改 nums
fmt.Println(nums) // [1 1 3 4 5]
names := []string{"zebra", "apple", "banana"}
sort.Strings(names)
fmt.Println(names) // [apple banana zebra]
}
对自定义结构体切片排序:实现 sort.Interface
当切片元素是 struct 或自定义类型时,必须让该类型满足 sort.Interface 接口(即实现 Len()、Less(i,j int) bool、Swap(i,j int) 三个方法)。常见错误是只实现了 Less 却忘了另外两个。
- 方法接收者必须是指针或值类型,且需保持一致;若用指针接收者,调用
sort.Sort时传入的也得是指针切片(如*[]T)——但通常直接用值接收者更简单 -
Less方法里不能用==比较浮点字段(应改用math.Abs(a-b) ) - 如果只是临时按某字段排序,优先考虑
sort.Slice(见下节),它更轻量
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
// 值接收者实现 sort.Interface
func (p []Person) Len() int { return len(p) }
func (p []Person) Less(i, j int) bool { return p[i].Age < p[j].Age }
func (p []Person) Swap(i, j int) { p[i], 
p[j] = p[j], p[i] }
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
sort.Sort(people) // 注意:传的是 people(值),不是 &people
fmt.Println(people) // [{Bob 25} {Alice 30} {Charlie 35}]
}
用 sort.Slice 按任意规则排序(Go 1.8+)
这是最灵活的方式:无需定义新类型或实现接口,直接传入切片和一个闭包函数描述比较逻辑。闭包参数 i、j 是索引,返回 true 表示 i 应排在 j 前面。
立即学习“go语言免费学习笔记(深入)”;
- 闭包内可访问外部变量(比如动态传入的排序字段名),适合配置驱动场景
- 性能略低于专用函数(有闭包调用开销),但对几千条数据几乎无感
- 注意闭包捕获变量时的生命周期——若在 goroutine 中使用,需确保变量不会提前被 GC
- 不能用于未导出字段排序(除非在同一个包内)
package main
import (
"fmt"
"sort"
)
type Product struct {
ID int
Price float64
Name string
}
func main() {
products := []Product{
{1, 19.99, "Laptop"},
{2, 5.49, "Mouse"},
{3, 12.99, "Keyboard"},
}
// 按价格升序
sort.Slice(products, func(i, j int) bool {
return products[i].Price < products[j].Price
})
fmt.Println(products) // [{2 5.49 Mouse} {3 12.99 Keyboard} {1 19.99 Laptop}]
// 按名称长度降序
sort.Slice(products, func(i, j int) bool {
return len(products[i].Name) > len(products[j].Name)
})
}
排序稳定性与逆序技巧
Go 的 sort 所有函数都是稳定的(相等元素的相对顺序不变),这点和 Python 的 sorted() 一致,但和 C 的 qsort() 不同。需要逆序时,不要写 a > b,而应翻转比较方向——否则可能因浮点误差或自定义逻辑导致不稳定。
- 对
sort.Ints等快捷函数,没有内置逆序版本;需先正序再sort.Reverse,或改用sort.Slice -
sort.Reverse接收一个sort.Interface,返回一个新的反向接口,常配合sort.Sort使用 - 用
sort.Slice实现逆序更直观:return a > b就是降序,return a 就是升序
真正容易被忽略的是:当排序键计算成本高(比如每次调用都要解析 JSON 字段),应预先计算并缓存,而不是在 Less 或闭包中重复计算——sort 可能多次调用比较函数。
# python
# js
# json
# go
# golang
# app
# ai
# apple
# 标准库
# less
# String
# sort
# 封装
# math
# 结构体
# 插入排序
# bool
# int
# 指针
# 接口
# 堆
# 值类型
# Struct
# Interface
# 泛型
# 闭包
# 切片
# len
# 自定义
# 的是
# 都是
# 这是
# 升序
# 浮点
# 是在
# 降序
# 都要
# 而不
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Linux系统运维自动化项目教程_Ansible批量管理实战
七夕网站制作视频,七夕大促活动怎么报名?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何在建站主机中优化服务器配置?
Android实现代码画虚线边框背景效果
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何在 Pandas 中基于一列条件计算另一列的分组均值
如何在建站之星网店版论坛获取技术支持?
如何在香港免费服务器上快速搭建网站?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何在Tomcat中配置并部署网站项目?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何在阿里云域名上完成建站全流程?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何自定义建站之星网站的导航菜单样式?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
,怎么在广州志愿者网站注册?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
使用spring连接及操作mongodb3.0实例
怎么用AI帮你为初创公司进行市场定位分析?
bootstrap日历插件datetimepicker使用方法
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何彻底删除建站之星生成的Banner?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel PHP版本要求一览_Laravel各版本环境要求对照
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
如何用花生壳三步快速搭建专属网站?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
在线教育网站制作平台,山西立德教育官网?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel如何创建自定义Artisan命令?(代码示例)
如何在阿里云虚拟服务器快速搭建网站?
PHP正则匹配日期和时间(时间戳转换)的实例代码
Laravel怎么为数据库表字段添加索引以优化查询
海南网站制作公司有哪些,海口网是哪家的?
如何用搬瓦工VPS快速搭建个人网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧


