Wie vermeide ich, sort.Interface für ähnliche Golang-Strukturen erneut zu implementieren?

Es gibt ein Problem, das mich in Golang stört. Angenommen, ich habe 2 Strukturen:

type Dog struct {
   Name string
   Breed string
   Age int
}

type Cat struct {
    Name string
    FavoriteFood string
    Age int
}

Und wenn ich versuche zu sortieren[]*Dog und[]*Cat durchAge, Ich muss 2 verschiedene Sortierstrukturen definieren wie:

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 {//..}

in natürlicher Gedanke ist es, einige @ zu implementierSortableByAge interface und erstelle einLess -Funktion über die Schnittstellenfunktion. Mögen

type SortableByAge interface {
    AgeValue() int
}

Und dann

type SortAnimal []SortableByAge
func (c SortDog) Less(i, j int) bool {
    return c[i].AgeValue() < c[j].AgeValue() 
}

Wie auch immer, laut:http: //golang.org/doc/faq#convert_slice_of_interfac

dogs := make([]*Dogs, 0 , 1)
//add dogs here
sort.Sort(SortAnimal(dogs))

Above ist nicht möglich.

Also frage ich mich, was ist die beste Vorgehensweise für diesen Fall und

Gibt es eine andere Technik, mit der sich die Notwendigkeit der Implementierung des @ verringern lässsort.Interface für ähnliche Strukturen, die ich immer wieder verpasst habe?

EDIT: Mir wurde klar, dass meine Beispiele schrecklich sind:

Im wirklichen Leben sind diese beiden Strukturen sehr unterschiedlich. Das einzige, was sie gemeinsam haben, ist, dass ich sie nach einem gemeinsamen numerischen Wert sortieren möchte.

Ein besseres Beispiel wäre:

type Laptop {//...}
type Pizza {//...}

Und das einzige, was diese beiden Strukturen gemeinsam haben, ist, dass ich ein Slice sortieren möchte (agh ... hätte nicht verwendet werden sollenPizza in Beispiel) von ihnen nach Preis.

So funktioniert das Kombinieren zu einer gemeinsamen Struktur in vielen Fällen nicht wirklich. Werde aber mal nachsehen gehen.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage