Go 示例: 按函数排序

有时我们希望按非自然顺序对集合进行排序。例如,假设我们想按长度而不是字母顺序对字符串进行排序。以下是在 Go 中进行自定义排序的示例。

package main
import (
    "cmp"
    "fmt"
    "slices"
)
func main() {
    fruits := []string{"peach", "banana", "kiwi"}

我们为字符串长度实现了一个比较函数。cmp.Compare 对此很有帮助。

    lenCmp := func(a, b string) int {
        return cmp.Compare(len(a), len(b))
    }

现在我们可以使用此自定义比较函数调用 slices.SortFunc 来按名称长度对 fruits 进行排序。

    slices.SortFunc(fruits, lenCmp)
    fmt.Println(fruits)

我们可以使用相同的技术对非内置类型的切片值进行排序。

    type Person struct {
        name string
        age  int
    }
    people := []Person{
        Person{name: "Jax", age: 37},
        Person{name: "TJ", age: 25},
        Person{name: "Alex", age: 72},
    }

使用 slices.SortFunc 按年龄对 people 进行排序。

注意:如果 Person 结构体很大,您可能希望切片包含 *Person,并相应地调整排序函数。如有疑问,请进行 基准测试

    slices.SortFunc(people,
        func(a, b Person) int {
            return cmp.Compare(a.age, b.age)
        })
    fmt.Println(people)
}
$ go run sorting-by-functions.go 
[kiwi peach banana]
[{TJ 25} {Jax 37} {Alex 72}]

下一个示例:恐慌