Go в примери: Подреждане чрез функции

Понякога може да искаме да подредим някакъв набор от стойности по някакъв друг признак, а не по естесвения им ред. Например нека си представим, че искаме да подредим набор от низове според тяхната дължина вместо по азбучен ред. Ето един пример с определено от потребителя на Го подреждане.

package main
import (
    "cmp"
    "fmt"
    "slices"
)
func main() {
    плодове := []string{"праскова", "банан", "киви"}

Осъществяваме функция, която сравнява дължините на два низа. cmp.Compare ни върши работа в тоя случай.

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

Сега можем да извикаме slices.SortFunc с нашата потребителска функция за сравнение, за да подредим отрязъка плодове по дължина на името.

    slices.SortFunc(плодове, lenCmp)
    fmt.Println(плодове)

Можем да ползваме същия подход и за невградени в езика видове данни.

    type Личност struct {
        име     string
        възраст int
    }
    народ := []Личност{
        Личност{име: "Пешо", възраст: 37},
        Личност{име: "Иван", възраст: 25},
        Личност{име: "Краси", възраст: 72},
    }

Подреждаме народ по възраст с помощта на slices.SortFunc.

Забележка: ако структурата Личност е голяма може би ще предпочетете отрязъка да съдържа *Личности и да преправите подреждащата си функция. Ако се колебаете, прочетете benchmark!

    slices.SortFunc(народ,
        func(a, b Личност) int {
            return cmp.Compare(a.възраст, b.възраст)
        })
    fmt.Println(народ)
}
$ go run sorting-by-functions.go 
[киви банан праскова]
[{Иван 25} {Пешо 37} {Краси 72}]

Следващ пример: .