我从 rethink 数据库中提取了一组 json 数据,然后使用 rethinkgo 将数据序列化为结构。我需要能够处理这些数据的一个子集,并根据其属性之一的值对其进行排序。为了避免使问题与我上面提到的工作复杂化,我创建了一个简化的(基于水果的)示例,说明正在使用的结构以及我想要实现的目标。package mainimport ( "fmt" "sort")type Fruit struct { AvgNumSeeds int Name string}type Apple struct { Fruit Diameter int}type Banana struct { Fruit Length int}type ByNumSeeds []Apple //[]Fruitfunc (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 的函数,它接受结构体和要排序的字段名称。我还没有尝试过,但是这个包很清楚它的效率不高,因为它通过使用反射并首先尝试使用标准接口方法来工作。有没有一种方法可以实现嵌套结构的排序,而不必为每个“子”结构类型重复排序?
1 回答
- 1 回答
- 0 关注
- 166 浏览
添加回答
举报
0/150
提交
取消