Как избежать повторной реализации sort.Interface для подобных структур golang
На Голанге меня беспокоит одна проблема. Скажем, у меня есть 2 структуры:
type Dog struct {
Name string
Breed string
Age int
}
type Cat struct {
Name string
FavoriteFood string
Age int
}
И когда я пытаюсь сортировать[]*Dog
а также[]*Cat
отAge
, Я должен определить 2 различных вида сортировки, как:
type SortCat []*Cat
func (c SortCat) Len() int {//..}
func (c SortCat) Swap(i, j int) {//..}
func (c SortCat) Less(i, j int) bool {//..}
type SortDog []*Dog
func (c SortDog) Len() int {//..}
func (c SortDog) Swap(i, j int) {//..}
func (c SortDog) Less(i, j int) bool {//..}
Естественная мысль заключается в реализации некоторыхSortableByAge
интерфейс и создатьLess
функция с использованием функции интерфейса. Подобно:
type SortableByAge interface {
AgeValue() int
}
А потом:
type SortAnimal []SortableByAge
func (c SortDog) Less(i, j int) bool {
return c[i].AgeValue() < c[j].AgeValue()
}
Однако согласно:http://golang.org/doc/faq#convert_slice_of_interface
dogs := make([]*Dogs, 0 , 1)
//add dogs here
sort.Sort(SortAnimal(dogs))
Выше не возможно.
Так что мне интересно, какова лучшая практика для этого случая и
Есть ли какой-либо другой метод, который может уменьшить потребность в реализацииsort.Interface
за подобные структуры снова и снова, что я пропустил?
РЕДАКТИРОВАТЬ: я понял, что мои примеры ужасны :(
В реальной жизни эти две структуры очень разные, единственное, что их объединяет, - это то, что я хочу отсортировать их по общему числовому значению.
Лучшим примером будет:
type Laptop {//...}
type Pizza {//...}
И единственное, что объединяет эти две структуры, это то, что я хочу отсортировать ломтик (ах ... не следовало использоватьPizza
в примере) из них по цене.
Таким образом, объединение их в общую структуру на самом деле не работает во многих случаях. Но посмотрим на иди генерации.