Понякога може да искаме да подредим някакъв набор от стойности по някакъв друг признак, а не по естесвения им ред. Например нека си представим, че искаме да подредим набор от низове според тяхната дължина вместо по азбучен ред. Ето един пример с определено от потребителя на Го подреждане.
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}]
Следващ пример: Ужас.