排序具有共同字段的不同结构的最佳解决方案

时间:2018-02-13 14:42:38

标签: sorting go

我有像

这样的结构类型
type A struct {
    Name string
    CreatedAt time.Time
    ...
}

type B struct {
    Title string
    CreatedAt time.Time
    ...
}

type C struct {
    Message string
    CreatedAt time.Time
    ...
} 

和通用切片

var result []interface{}

包含A,B和C元素(将来还会有更多)

我想通过“CreatedAt'”

来对该切片进行排序

什么是最佳解决方案?我想避免检查类型或铸造......

1 个答案:

答案 0 :(得分:1)

无论如何,您可以拥有包含这两种类型的切片的唯一方法是切片包含由两种类型(包括interface{})实现的一些接口。

您可能希望使用sort包并在切片上实施sort.Interface。解决方案有点冗长,但很有道理:

type Creation interface {
    GetCreated() time.Time
}

type A struct {
    Name      string
    CreatedAt time.Time
}

func (a *A) GetCreated() time.Time {
    return a.CreatedAt
}

func (a *A) String() string {
    return a.Name
}

type B struct {
    Title     string
    CreatedAt time.Time
}

func (b *B) GetCreated() time.Time {
    return b.CreatedAt
}

func (b *B) String() string {
    return b.Title
}

type AorB []Creation

func (x AorB) Len() int {
    return len(x)
}

func (x AorB) Less(i, j int) bool {
    // to change the sort order, use After instead of Before
    return x[i].GetCreated().Before(x[j].GetCreated())
}

func (x AorB) Swap(i, j int) {
    x[i], x[j] = x[j], x[i]
}

func main() {
    a := &A{"A", time.Now()}
    time.Sleep(1 * time.Second)
    b := &B{"B", time.Now()}
    aOrB := AorB{b, a}

    fmt.Println(aOrB)
    // [B A]

    sort.Stable(aOrB)

    fmt.Println(aOrB)
    // [A B]
}