41-sorting-by-func

// 如何对集合中的数据进行非自然顺序的排序。

// 假设要对string更具长度而非字母顺序排序。

package main

import (
	"fmt"
	"sort"
)

// 为了按Go中自定义函数排序,需要一个相应的类型
type byLength []string // 创建一个byLength类型,它只是内置类型[]string的别名

// 在自定义类型上实现sort.Interface中的len、Less、Swap方法
// 这样就可以使用sort包的泛型Sort函数
func (a byLength) Len() int { return len(a) }

// Swap和Less在不同的类型之间都是很相似的
func (a byLength) Swap(i, j int) { a[i], a[j] = a[j], a[i] }

// Less中写的是实际的自定义排序逻辑
// 在我们的例子中,根据string的长度进行升序排序,所以使用len()进行长度比较
func (a byLength) Less(i, j int) bool { return len(a[i]) < len(a[j]) }

func main() {
	fruits := []string{"peach", "banana", "kiwi"}
	// 将原始的fruits切片转换为buLength类型,
	// 然后在该类型上使用sort.Sort函数来实现自定义排序
	sort.Sort(byLength(fruits))
	fmt.Println(fruits)
}

// 通过遵循这种模式来创建自定义类型,
// 并在该类型上实现sort.Interfacce的三个接口方法,
// 然后在该自定义类型的集合上调用sort.Sort函数,
// 可以按照任意方式对Go切片进行排序
上次修改: 10 January 2020