Go sort包需按场景选函数:基础类型用sort.Ints等,结构体或复杂规则用sort.Slice,复用逻辑才实现sort.Interface;数组需转切片排序,稳定性需显式用SliceStable。
Go 的包不提供“一键排序任意切片”的函数,你必须根据数据类型和排序需求,明确选对路径:基础类型用/,结构体或复杂规则用,复用逻辑才实现。选错就容易 panic、结果错乱、性能白耗。
基础类型排序别绕弯,直接用
/
这些函数专为
、
、
优化,语义清晰、零闭包开销、编译期就能拦住类型错误。
只支持升序;要降序?得配
或换
传
或
会直接编译失败,不能强转
含
的
会 panic,得自己先过滤
排序后原切片被修改,不返回新切片;传
也会 panic,调用前建议判空
示例:
按字典序升序;想按长度降序?不行,得切到
。
结构体、多字段、降序?无脑上
Go 1.8+ 后,这是绝大多数自定义排序的首选——不用定义新类型、不改业务结构、一行闭包搞定。
立即学习
“
go语言免费学习笔记(深入)
”;
比较函数签名是
,返回
表示
应排在
前面
多字段排序必须用
分层判断,避免
短路导致次级条件失效
切片必须可寻址:不能写
,会编译报错;得先赋值给变量再传
字段必须可导出(首字母大写),否则闭包里读不到值
需要稳定排序(相同键值保持原始顺序)?必须换
,
不保证
示例:
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数组安全、编译
下载
什么时候才该实现
?
只有两种情况值得:一是在多个地方反复用同一套排序规则(比如“价格降序”在商品列表、后台导出、缓存预热里都用),二是你要把排序能力绑定到某个类型上(比如写通用库或兼容老版本 Go)。
必须定义新类型(如
),不能直接在原 struct 上实现
方法里禁止修改数据,只做比较;
必须真正交换底层数组元素
少实现
、
、
中任一个,编译就报错:
必须满足严格弱序(比如
恒为
),否则排序结果未定义
示例:
—— 后续所有同类型排序都可复用
类型。
数组怎么排序?稳定性怎么保?两个隐藏坑别踩
Go 中数组(如
)不是切片,
所有函数都不接受数组。稳定性也不是默认选项,它被很多人默认当成“理所当然”,其实不是。
排序数组必须先转切片:
,然后传给
或其他函数;原数组内容同步更新,因为共享底层数组
不稳定:多人同分时,原始提交顺序可能被打乱;要保持相对顺序?必须用
或
所有
函数都不支持并发调用——别在多个 goroutine 里同时对同一底层数组排序
不返回
,而是返回插入位置;用前得确认切片已排序,且检查返回值是否 len(slice) 再取值
真正容易被忽略的,是“可寻址性”和“稳定性”的隐式依赖:你以为传个切片就行,但字面量不行;你以为排完还按输入顺序,但同分项其实早乱了。
sortsort.Intssort.Stringssort.Slicesort.Interfacesort.Intssort.Strings[]int[]string[]float64sort.Reversesort.Slice[]int64[]interface{}nil[]*stringnilsort.Strings(names)sort.Slicesort.Slicefunc(i, j int) booltrueijif-else&&sort.Slice([]int{1,2}, ...)sort.SliceStablesort.Slicesort.Slice(people, func(i, j int) bool { if people[i].Age != people[j].Age { return people[i].Age people[j].Name })sort.Interfacetype ByPrice []ProductLessSwapLenLessSwapdoes not implement sort.InterfaceLessLess(i,i)falsesort.Sort(ByPrice(products))ByPrice[5]intsortages[:]sort.Slicesort.Slicesort.SliceStablesort.Stablesortsort.Search-1