如何使用Golang sort排序切片_Golang sort排序方法示例
技术百科
P粉602998670
发布时间:2026-01-01
浏览: 次 sort.Slice 是 Go 1.8 引入的灵活切片排序方式,支持任意类型切片按自定义逻辑排序,无需实现 sort.Interface;使用时需注意索引顺序、指针解引用及 Less 函数中避免耗时操作。
sort.Slice 是最常用也最灵活的切片排序方式
Go 1.8 引入的 sort.Slice 允许你对任意切片按自定义逻辑排序,无需实现 sort.Interface。它直接接收切片和一个比较函数(闭包),语义清晰、写法简洁。
常见错误是误传指针或搞错索引顺序,比如把 i > j 写成 i 导致逆序结果被当成正序。
- 比较函数必须返回
bool:当i应排在j前面时返回true - 切片必须是地址可寻址的(不能是字面量直接传参,如
sort.Slice([]int{1,2}, ...)会报错) - 原地排序,不创建新切片
ages := []int{32, 18, 45, 23}
sort.Slice(ages, func(i, j int) bool {
return ages[i] < ages[j] // 升序
})
// ages == []int{18, 23, 32, 45}
sort.Strings / sort.Ints 等内置函数只适用于基础类型切片
当你处理的是 []string、[]int、[]float64 这类标准类型切片时,直接用对应函数最快,它们底层做了优化,比 sort.Slice 略快且更安全(不会因闭包捕获错误变量引发隐患)。
注意:这些函数**不支持自定义规则**。比如想按字符串长度排序 []string,就不能用 sort.Strings,必须退回 sort.Slice。
-
sort.Strings按字典序升序;sort.Ints按数值升序 - 没有
sort.Floats的逆序版本,要降序需配合sort.Reverse - 对
[]*string或含空值的切片,这些函数会 panic,得自己判空
names := []string{"zoe",
"amy", "bob"}
sort.Strings(names) // ["amy", "bob", "zoe"]
sort.SliceStable 保留相等元素的原始相对位置
当排序依据不唯一(比如按结构体的某个字段排序,多个元素该字段值相同),而你又需要保持它们原来的先后顺序时,必须用 sort.SliceStable。普通 sort.Slice 不保证稳定性。
典型场景:先按分数降序,分数相同时按提交时间升序——第二级排序依赖原始顺序,否则时间信息会被打乱。
- 性能略低于
sort.Slice(稳定排序算法开销稍大) - 比较函数写法和
sort.Slice完全一致 - Go 标准库中只有
sort.SliceStable和sort.Stable提供稳定性保障
type Student struct {
Name string
Score int
}
students := []Student{{"a", 85}, {"b", 92}, {"c", 85}}
sort.SliceStable(students, func(i, j int) bool {
return students[i].Score > students[j].Score // 高分在前
})
// "a" 和 "c" 分数相同,"a" 仍排在 "c" 前面
自定义结构体排序必须用 sort.Slice 或实现 Interface
对结构体切片排序,没有像 Python 的 key= 那样一键指定字段的方式。最直接的是用 sort.Slice + 闭包;如果同一结构体在多处按同一规则排序,可考虑实现 sort.Interface 接口,复用性更高。
容易忽略的点是:闭包里访问结构体字段时,若切片元素是指针([]*T),记得解引用;若忘了加 *,可能静默排序失败(比如比较的是地址而非值)。
- 实现
Len()、Less(i,j)、Swap(i,j)三个方法即可 - 方法接收者建议用指针(
*[]T),避免复制大切片 - 不要在
Less中做耗时操作(如网络请求、文件读取),它会被频繁调用
fruits := []struct{ Name string; Price float64 }{
{"apple", 2.5}, {"banana", 1.8}, {"cherry", 3.2},
}
sort.Slice(fruits, func(i, j int) bool {
return fruits[i].Price < fruits[j].Price
})
Go 的排序设计偏向显式与可控,没有“魔法”式的默认行为。真正复杂的地方往往不在怎么写,而在于:是否意识到相等元素的顺序会影响业务逻辑,以及是否在比较函数里无意引入了副作用或越界访问。
# python
# app
# 排序算法
# go
# golang
# 标准库
# apple
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Windows10系统怎么查看CPU核心数_Win
- 如何在Golang中处理JSON字段缺失_Gola
- 如何在Golang中验证模块完整性_Golangg
- php怎么下载安装后无法解析php文件_服务器配置
- 如何在Golang中写入XML文件_生成符合规范的
- Win11怎么更改系统语言_Win11中文语言包下
- 如何在同包不同文件中正确引用 Go 结构体
- Python数据抓取合法性_合规说明【指导】
- 如何在JavaScript中动态拼接PHP的bas
- Windows怎样拦截WPS弹窗广告_Window
- Windows10系统怎么查看CPU温度_Win1
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- php本地部署支持nodejs吗_php与node
- c++怎么使用类型萃取type_traits_c+
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Python异步网络编程_aiohttp说明【指导
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Windows系统文件被保护机制阻止怎么办_权限不
- 如何使用Golang安装依赖库_管理模块和第三方包
- 如何在Golang中使用replace替换模块_指
- Windows电脑如何进入安全模式?(多种按键方法
- Windows10如何更改任务栏高度_Win10解
- Windows蓝屏错误0x0000002C怎么解决
- Win11怎么设置环境变量_Win11配置Path
- Python类装饰器使用_元编程解析【教程】
- Win10怎样清理C盘Steam游戏缓存_Win1
- Win11怎么更改管理员名字 Win11修改账户名
- Win11怎么设置系统还原_Windows11系统
- PythonGIL机制理解_多线程限制解析【教程】
- Django 测试数据库表缺失与字段未创建问题的完
- Windows11怎么用“记事本”自动换行与编码
- 如何在Golang中实现自定义Benchmark_
- Windows 11怎么更改锁屏超时时间_Wind
- php485在php5.6下能用吗_php485旧
- C++如何使用std::optional?(处理可
- 网站内页做seo排名怎么做?
- Windows10如何删除Windows.old_
- Win11怎么检查TPM2.0模块_Windows
- Windows10电脑怎么设置文件权限_Win10
- MySQL 中使用 IF 和 CASE 实现查询字
- 如何将文本文件中的竖排字符串转换为横排字符串
- mac怎么安装字体_MAC添加第三方字体与字体册管
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- Python深度学习实战教程_神经网络模型构建与训
- Win11更新后变慢怎么办_Win11系统更新后卡
- 如何在Golang中实现服务熔断与限流_Golan
- 如何在Golang中修改数组元素_通过指针实现原地
- Win10系统字体模糊怎么办_Windows10高
- LINUX的SELinux是什么_详解LINUX强
- Win11开机速度慢怎么优化_Win11系统启动加

"amy", "bob"}
sort.Strings(names) // ["amy", "bob", "zoe"]
QQ客服