7.6 使用sort.Interface来排序
与字符串格式化类似,排序也是一个在很多程序中广泛使用的操作。尽管一个最小的快排(Quicksort)只需15行左右,但一个健壮的实现长很多。所以我们无法想象在每次需要时都重新写一遍或者复制一遍。
幸运的是,sort包提供了针对任意序列根据任意排序函数原地排序的功能。这样的设计其实并不常见。在很多语言中,排序算法跟序列数据类型绑定,排序算法则跟序列元素类型绑定。与之相反的是,Go语言的sort.Sort函数对序列和其中元素的布局无任何要求,它使用sort.Interface接口来指定通用排序算法和每个具体的序列类型之间的协议(contract)。这个接口的实现确定了序列的具体布局(经常是一个slice),以及元素期望的排序方式。
一个原地排序算法需要知道三个信息:序列长度、比较两个元素的含义以及如何交换两个元素,所以sort.Interface接口就有三个方法:
要对序列排序,需要先确定一个实现了如上三个方法的类型,接着把sort.Sort函数应用到上面这类方法的实例上。我们先考虑几乎是最简单的一个例子:字符串slice。定义的新类型StringSlice以及它的Len、Less、Swap三个方法如下所示:
现在就可以对一个字符串slice进行排序,只须简单地把一个slice转换为StringSlice类型即可,如下所示: ...
Get Go程序设计语言 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.