Go by Example: Sorting by Functions

A veces querremos ordenar una colección por algo distinto a su orden natural. Por ejemplo, supongamos que queremos ordenar cadenas por su longitud en lugar de alfabéticamente. Aquí hay un ejemplo de ordenaciones personalizadas en Go.

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

Implementamos una función de comparación para la longitud de las cadenas. cmp.Compare es útil para esto.

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

Ahora podemos llamar a slices.SortFunc con esta función de comparación personalizada para ordenar fruits por la longitud del nombre.

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

Podemos usar la misma técnica para ordenar una secuencia (slice) de valores que no son tipos integrados.

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

Ordenar people por edad usando slices.SortFunc.

Nota: si la estructura Person es grande, es posible que quieras que la secuencia contenga *Person en su lugar y ajustar la función de ordenación en consecuencia. Si tienes dudas, ¡haz pruebas y benchmarks!

    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}]

Siguiente ejemplo: Panic.