我有像
这样的结构类型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'”
来对该切片进行排序什么是最佳解决方案?我想避免检查类型或铸造......
答案 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]
}