gobyexample/examples/sorting-by-functions/sorting-by-functions.go

54 lines
1.3 KiB
Go

// Sometimes we'll want to sort a collection by something
// other than its natural order. For example, suppose we
// wanted to sort strings by their length instead of
// alphabetically. Here's an example of custom sorts
// in Go.
package main
import (
"cmp"
"fmt"
"slices"
)
func main() {
fruits := []string{"peach", "banana", "kiwi"}
// We implement a comparison function for string
// lengths. `cmp.Compare` is helpful for this.
lenCmp := func(a, b string) int {
return cmp.Compare(len(a), len(b))
}
// Now we can call `slices.SortFunc` with this custom
// comparison function to sort `fruits` by name length.
slices.SortFunc(fruits, lenCmp)
fmt.Println(fruits)
// We can use the same technique to sort a slice of
// values that aren't built-in types.
type Person struct {
name string
age int
}
people := []Person{
Person{name: "Jax", age: 37},
Person{name: "TJ", age: 25},
Person{name: "Alex", age: 72},
}
// Sort `people` by age using `slices.SortFunc`.
//
// Note: if the `Person` struct is large,
// you may want the slice to contain `*Person` instead
// and adjust the sorting function accordingly. If in
// doubt, [benchmark](testing-and-benchmarking)!
slices.SortFunc(people,
func(a, b Person) int {
return cmp.Compare(a.age, b.age)
})
fmt.Println(people)
}