我正在尝试按其类型为time.Time的成员在Go中对结构进行排序。结构如下。
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 // 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] }
映射定义如下
var reviews_data_map = make(map[string]reviews_data)
在地图填充值之后,按值对地图进行排序如下
//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)
问题是结果没有排序,谁能告诉我问题是什么。
在我看来,它看起来像是:
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) }
输出:
[{ {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}]