为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
30秒到达战场 2021-07-27 00:24:05
我从 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
提交
取消
意见反馈 帮助中心 APP下载
官方微信