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.