Go за Прикладом: Сортування функціями

Інколи виникає необхідність у реалізації сортування, але по-іншому, не в натуральному порядку. Наприклад, сортування рядків за довжиною, на противагу сортуванню за алфавітом. Спробуємо розібратись як це реалізувати у GO.

package main
import (
    "fmt"
    "sort"
)

Щоб відсортувати колекцію, використовуючи власні правилами в Go, нам спочатку треба мати цю колекцію. Створюємо тип byLength (заДовжиною) який являє собою псевдонім до зрізу рядків []string.

type byLength []string

Нам необхідно реалізувати наступний інтерфейс - sort.Interface, тобто створити методи Len, Less та Swap - які будуть оперувати на нашому типі даних, що дозволить нам використати узагальнену функцію Sort пакету sort. Len та Swap зазвичай будуть схожими до інших свої аналогів. Найбільш відрізнятиметься Less, ця функція, реалізовує власну логіку сортування, яка (в нашому випадку) полягає в порівнянні довжини рядків.

func (s byLength) Len() int {
    return len(s)
}
func (s byLength) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
    return len(s[i]) < len(s[j])
}

Після реалізації інтерфейсу sort.Interface, ми можемо спробувати наше сортування на прикладі зрізу fruits, початково конвертувавши зріз у тип byLength, передавши його у використання sort.Sort .

func main() {
    fruits := []string{"персик", "банан", "ківі"}
    sort.Sort(byLength(fruits))
    fmt.Println(fruits)
}

Запуск нашої програми покаже нам перелік фруктів відсортований за довжиною рядка.

$ go run sorting-by-functions.go
[ківі банан персик]

Створючи новий тип даних, реалізуючи методи інтерфейсу sort.Interface по відношенню до цього типу даних і викликаючи sort.Sort з аргументом (новоствореним типом даних) - ми отримуємо здатність до сортування за власною логікою.

Наступний приклад: Паніка (Panic).