刚开始学习goLang。
想知道如何在Go中以相反的顺序对struct元素进行排序。让我们说,我从数据库得到的结果如下:
$lastId = User::create($userData)->id;
现在,我在切片var results []<someClass>
collection.C(results).Find(bson.M{"<someid>":<id_val>}).All(&results)
中提供了数据库对象/结果。如何在名为time的列上以相反的顺序对切片results
进行排序?
答案 0 :(得分:4)
最简单的方法是让MongoDB对记录进行排序:
var results []YourType
err := sess.DB("").C("collname").Find(bson.M{"someid": "someidval"}).
Sort("-timefield").All(&results)
如果由于某种原因您不能或不想这样做,您可以使用sort
包。您需要实施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()
来决定元素和索引{{1小于索引i
的元素。
使用它(在Go Playground上试试):
j
var results []YourType
// Run your MongoDB query here
// Now sort it by Timestamp decreasing:
sort.Sort(ByTimestamp(results))
的替代实施方法是使用Time.Before()
,但将索引Less()
的元素与索引j
进行比较:
i
在Go Playground上尝试此变体。