Вопрос проверяет знание сортировки пользовательских типов данных в Go с использованием пакета sort и интерфейса sort.Interface.
В Go нет встроенной сортировки для произвольных типов данных, таких как структуры. Для этого используется пакет sort, который предоставляет универсальный интерфейс sort.Interface. Чтобы отсортировать слайс структур, необходимо определить тип, реализующий этот интерфейс, и затем вызвать sort.Sort().
Интерфейс sort.Interface требует три метода:
Len() int — возвращает длину слайса.Less(i, j int) bool — определяет порядок сортировки: возвращает true, если элемент с индексом i должен стоять перед элементом с индексом j.Swap(i, j int) — меняет местами элементы с индексами i и j.Пример сортировки слайса структур Person по полю Age (int):
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
type ByAge []Person
func (a ByAge) Len() int { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
sort.Sort(ByAge(people))
fmt.Println(people) // [{Bob 25} {Alice 30} {Charlie 35}]
}Начиная с Go 1.8, можно использовать sort.Slice, который принимает слайс и анонимную функцию для сравнения. Это избавляет от необходимости объявлять отдельный тип:
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})Этот подход короче и удобнее для одноразовой сортировки.
Сортировка слайса структур в Go выполняется через реализацию интерфейса sort.Interface или с помощью sort.Slice. Второй способ предпочтительнее для простых случаев, так как требует меньше кода. Понимание обоих подходов важно для работы с данными в Go.