逆序 struct/results

Reverse chronological order of struct/results

刚开始学习goLang。

想知道我们如何在 Go 中以相反的顺序对结构元素进行排序。比方说,我从数据库中得到的结果类似于:

var results []<someClass>
collection.C(results).Find(bson.M{"<someid>":<id_val>}).All(&results)

现在,我的数据库 objects/results 在切片 results 中可用。如何在名为 time 的列上以相反的顺序对切片 results 进行排序?

最简单的方法是让 MongoDB 对记录进行排序:

var results []YourType
err := sess.DB("").C("collname").Find(bson.M{"someid": "someidval"}).
    Sort("-timefield").All(&results)

如果由于某种原因您不能或不想这样做,您可以使用 sort package. You need to implement sort.Interface

例如:

type YourType struct {
    SomeId    string
    Timestamp time.Time
}

type ByTimestamp []YourType

func (a ByTimestamp) Len() int           { return len(a) }
func (a ByTimestamp) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByTimestamp) Less(i, j int) bool {
    return a[i].Timestamp.After(a[j].Timestamp)
}

这个 ByTimestamp 类型是 YourType 的一个切片,它定义了一个反向时间戳顺序,因为 Less() 方法使用 Time.After() 来决定元素和索引 i 小于索引 j.

处的元素

并使用它(在 Go Playground 上试用):

var results []YourType

// Run your MongoDB query here

// Now sort it by Timestamp decreasing:
sort.Sort(ByTimestamp(results))

Less() 的另一种实现方式是使用 Time.Before(),但将索引 j 处的元素与索引 i 处的元素进行比较:

func (a ByTimestamp) Less(i, j int) bool {
    return a[j].Timestamp.Before(a[i].Timestamp)
}

Go Playground 上试试这个变体。