跳转到主内容
极星编程网:以代码为星,赴技术山海!

Golang sort包怎么排序_Golang排序操作教程【必看】

Go sort包需按场景选函数:基础类型用sort.Ints等,结构体或复杂规则用sort.Slice,复用逻辑才实现sort.Interface;数组需转切片排序,稳定性需显式用SliceStable。 Go 的
sort
包不提供“一键排序任意切片”的函数,你必须根据数据类型和排序需求,明确选对路径:基础类型用
sort.Ints
/
sort.Strings
,结构体或复杂规则用
sort.Slice
,复用逻辑才实现
sort.Interface
。选错就容易 panic、结果错乱、性能白耗。 基础类型排序别绕弯,直接用
sort.Ints
/
sort.Strings
这些函数专为
[]int
、
[]string
、
[]float64
优化,语义清晰、零闭包开销、编译期就能拦住类型错误。 只支持升序;要降序?得配
sort.Reverse
或换
sort.Slice
传
[]int64
或
[]interface{}
会直接编译失败,不能强转 含
nil
的
[]*string
会 panic,得自己先过滤 排序后原切片被修改,不返回新切片;传
nil
也会 panic,调用前建议判空 示例:
sort.Strings(names)
按字典序升序;想按长度降序?不行,得切到
sort.Slice
。 结构体、多字段、降序?无脑上
sort.Slice
Go 1.8+ 后,这是绝大多数自定义排序的首选——不用定义新类型、不改业务结构、一行闭包搞定。 立即学习 “ go语言免费学习笔记(深入) ”; 比较函数签名是
func(i, j int) bool
,返回
true
表示
i
应排在
j
前面 多字段排序必须用
if-else
分层判断,避免
&&
短路导致次级条件失效 切片必须可寻址:不能写
sort.Slice([]int{1,2}, ...)
,会编译报错;得先赋值给变量再传 字段必须可导出(首字母大写),否则闭包里读不到值 需要稳定排序(相同键值保持原始顺序)?必须换
sort.SliceStable
,
sort.Slice
不保证 示例:
sort.Slice(people, func(i, j int) bool { if people[i].Age != people[j].Age { return people[i].Age people[j].Name })
go语言参考手册 中文CHM版 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译 下载 什么时候才该实现
sort.Interface
? 只有两种情况值得:一是在多个地方反复用同一套排序规则(比如“价格降序”在商品列表、后台导出、缓存预热里都用),二是你要把排序能力绑定到某个类型上(比如写通用库或兼容老版本 Go)。 必须定义新类型(如
type ByPrice []Product
),不能直接在原 struct 上实现
Less
方法里禁止修改数据,只做比较;
Swap
必须真正交换底层数组元素 少实现
Len
、
Less
、
Swap
中任一个,编译就报错:
does not implement sort.Interface
Less
必须满足严格弱序(比如
Less(i,i)
恒为
false
),否则排序结果未定义 示例:
sort.Sort(ByPrice(products))
—— 后续所有同类型排序都可复用
ByPrice
类型。 数组怎么排序?稳定性怎么保?两个隐藏坑别踩 Go 中数组(如
[5]int
)不是切片,
sort
所有函数都不接受数组。稳定性也不是默认选项,它被很多人默认当成“理所当然”,其实不是。 排序数组必须先转切片:
ages[:]
,然后传给
sort.Slice
或其他函数;原数组内容同步更新,因为共享底层数组
sort.Slice
不稳定:多人同分时,原始提交顺序可能被打乱;要保持相对顺序?必须用
sort.SliceStable
或
sort.Stable
所有
sort
函数都不支持并发调用——别在多个 goroutine 里同时对同一底层数组排序
sort.Search
不返回
-1
,而是返回插入位置;用前得确认切片已排序,且检查返回值是否 len(slice) 再取值 真正容易被忽略的,是“可寻址性”和“稳定性”的隐式依赖:你以为传个切片就行,但字面量不行;你以为排完还按输入顺序,但同分项其实早乱了。

相关文章