在线文档 > 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 切片进行排序。