2016-11-28 7 views
3

Только что начал изучать goLang.Обратный хронологический порядок struct/results

Подумаем, как мы можем отсортировать элементы структуры в обратном порядке в Go. Скажем, я получаю результаты от чего-то базы данных вроде как:

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

Теперь у меня есть объекты базы данных/результаты, доступные в срезе results. Как я могу сортировать фрагмент results в обратном порядке в столбце под названием time?

+1

Вы получаете результаты от MongoDB? – notionquest

+0

@notionquest, Да. –

ответ

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() решить, если элемент и индекс 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.

+0

Да. Спасибо за ответ. Я тоже понял ваше намерение. –