在线文档  >   Golang练习   >   使用自定义函数排序

有时,我们想按照某种方式而不是其自然顺序对集合进行排序。例如,假设我们想按字符串长度而不是按字母顺序排序字符串。这里是一个在Go中实现自定义排序的例子。

package main

import (
    "fmt"
    "sort"
)

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

// 我们在类型上实现了sort.Interface-Len、Less和Swap,以便我们可以使用sort包的通用排序函数Sort。
// Len和Swap通常在类型之间相似,Less将保持实际的自定义排序逻辑。
// 在我们的例子中,我们想按字符串长度递增的顺序排序,因此我们在这里使用len(s[i])和len(s[j])。
func (s byLength) Len() int {
    return len(s)
}
func (s byLength) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
    return len(s[i]) < len(s[j])
}

// 有了所有这些,我们现在可以通过将原始的fruits 切片转换为 byLength 来实现自定义排序,然后使用sort.Sort对该类型的切片进行排序。
func main() {
    fruits := []string{"peach", "banana", "kiwi"}
    sort.Sort(byLength(fruits))
    fmt.Println(fruits)
}

运行结果如下:

$ go run sorting-by-functions.go 
[kiwi peach banana]

根据需要,运行我们的程序会显示一个按字符串长度排序的列表。
通过遵循创建自定义类型的相同模式,在该类型上实现三个“接口”方法,然后调用 sort。对该自定义类型的集合进行排序,我们可以按任意函数对 Go 切片进行排序。