go

How to sort by time.Time


I am trying to sort struct in Go by its member which is of type time.Time. the structure is as follows.

type reviews_data struct {
    review_id string
    date time.Time
    score int
    firstname string
    anonymous bool
    review_text string
    title_text string
    rating float64
    upcount int
}

I have the below functions for sorting

type timeSlice []reviews_data

// Forward request for length
func (p timeSlice) Len() int {
    return len(p) 
}

// Define compare
func (p timeSlice) Less(i, j int) bool {
    return p[i].date.Before(p[j].date)
}

// Define swap over an array
func (p timeSlice) Swap(i, j int) {
    p[i], p[j] = p[j], p[i] 
}

A map is defined as follows

var reviews_data_map = make(map[string]reviews_data)

After the map gets filled with values,sorting of the map by values is done as below

//Sort the map by date
    date_sorted_reviews := make(timeSlice, 0, len(reviews_data_map))
    for _, d := range reviews_data_map {
        date_sorted_reviews = append(date_sorted_reviews, d)
    }       
    sort.Sort(date_sorted_reviews)

The problem is that the result is not sorted.Can anyone tell me what the problem is.


Solution

  • It looks sorted to me:

    package main
    
    import (
        "fmt"
        "sort"
        "time"
    )
    
    type reviews_data struct {
        review_id   string
        date        time.Time
        score       int
        firstname   string
        anonymous   bool
        review_text string
        title_text  string
        rating      float64
        upcount     int
    }
    
    type timeSlice []reviews_data
    
    func (p timeSlice) Len() int {
        return len(p)
    }
    
    func (p timeSlice) Less(i, j int) bool {
        return p[i].date.Before(p[j].date)
    }
    
    func (p timeSlice) Swap(i, j int) {
        p[i], p[j] = p[j], p[i]
    }
    
    func main() {
        var reviews_data_map = make(map[string]reviews_data)
        reviews_data_map["1"] = reviews_data{date: time.Now().Add(12 * time.Hour)}
        reviews_data_map["2"] = reviews_data{date: time.Now()}
        reviews_data_map["3"] = reviews_data{date: time.Now().Add(24 * time.Hour)}
        //Sort the map by date
        date_sorted_reviews := make(timeSlice, 0, len(reviews_data_map))
        for _, d := range reviews_data_map {
            date_sorted_reviews = append(date_sorted_reviews, d)
        }
        fmt.Println(date_sorted_reviews)
        sort.Sort(date_sorted_reviews)
        fmt.Println(date_sorted_reviews)
    }
    

    Output:

    [{ {63393534000 0 0x1ba3e0} 0  false   0 0} { {63393490800 0 0x1ba3e0} 0  false   0 0} { {63393577200 0 0x1ba3e0} 0  false   0 0}]
    [{ {63393490800 0 0x1ba3e0} 0  false   0 0} { {63393534000 0 0x1ba3e0} 0  false   0 0} { {63393577200 0 0x1ba3e0} 0  false   0 0}]