在 Go 中对共享嵌套结构属性进行排序

我从 rethink 数据库中提取了一组 json 数据,然后使用 rethinkgo 将数据序列化为结构。我需要能够处理这些数据的一个子集,并根据其属性之一的值对其进行排序。


为了避免使问题与我上面提到的工作复杂化,我创建了一个简化的(基于水果的)示例,说明正在使用的结构以及我想要实现的目标。


package main


import (

    "fmt"

    "sort"

)


type Fruit struct {

    AvgNumSeeds int

    Name        string

}


type Apple struct {

    Fruit

    Diameter int

}


type Banana struct {

    Fruit

    Length int

}


type ByNumSeeds []Apple //[]Fruit


func (p ByNumSeeds) Len() int {

    return len(p)

}


func (p ByNumSeeds) Swap(i, j int) {

    p[i], p[j] = p[j], p[i]

}


func (p ByNumSeeds) Less(i, j int) bool {

    return p[i].AvgNumSeeds < p[j].AvgNumSeeds

}


func main() {

    apples := []Apple{

        Apple{Fruit: Fruit{AvgNumSeeds: 4, Name: "Cox"}, Diameter: 10},

        Apple{Fruit: Fruit{AvgNumSeeds: 6, Name: "Granny Smith"}, Diameter: 20},

        Apple{Fruit: Fruit{AvgNumSeeds: 5, Name: "Pink Lady"}, Diameter: 21},

        Apple{Fruit: Fruit{AvgNumSeeds: 2, Name: "Russett"}, Diameter: 15},

        Apple{Fruit: Fruit{AvgNumSeeds: 1, Name: "Crab"}, Diameter: 7},

        Apple{Fruit: Fruit{AvgNumSeeds: 7, Name: "Brambley"}, Diameter: 40},

        Apple{Fruit: Fruit{AvgNumSeeds: 3, Name: "Braeburn"}, Diameter: 25},

    }


如您所见,我有两个结构体,Apples 和 Bananas,它们共享来自 Fruit 结构体的属性;一个排序(包括接口函数 Len、Swap、Less)和主函数,它为苹果和香蕉设置数据结构,然后尝试对它们进行排序。


我对 Apples 和 Bananas 想要的是一种(类型 ByNumSeeds、Len、Swap、Less),它能够分别对 Apples 和 Bananas 进行排序,它们都从 Fruit 结构 AvgNumSeeds 共享一个属性。


我在这段代码中创建的排序以一片苹果作为它的接口,并且确实按 AvgNumSeeds 对我的苹果数组进行了排序。但是,我无法找到一种方法让它同时与 Apple 和 Banana 结构一起使用。

我的下一个想法是通过以某种方式将一片苹果/香蕉投射到一片水果上来解决这个错误,但这并不完全是正确的做法。


在我对解决方案的调查中,我遇到了一个名为 sortutil 的包,它有一个名为 AscByField 的函数,它接受结构体和要排序的字段名称。我还没有尝试过,但是这个包很清楚它的效率不高,因为它通过使用反射并首先尝试使用标准接口方法来工作。


有没有一种方法可以实现嵌套结构的排序,而不必为每个“子”结构类型重复排序?


30秒到达战场
浏览 167回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go