Golang中如何按日期升序排序Map
Golang中如何按日期升序排序Map 如何按升序对包含日期字段的映射进行排序? 以下是生成映射的代码示例。
输出:
{
"10": {
"charges": 110,
"from_dates": "2009-11-30T23:00:00Z"
},
"20": {
"charges": 120,
"from_dates": "2009-11-11T23:00:00Z"
},
"30": {
"charges": 130,
"from_dates": "2009-11-17T23:00:00Z"
}
}
我期望实现的输出:
{
"10": {
"charges": 120,
"from_dates": "2009-11-11T23:00:00Z"
},
"20": {
"charges": 130,
"from_dates": "2009-11-17T23:00:00Z"
},
"30": {
"charges": 110,
"from_dates": "2009-11-30T23:00:00Z"
}
}
我尝试使用 sort.Sort(),但出现了错误:cannot use from_dates["from_dates"] (value of type map[int]time.Time) as sort.Interface value in argument to sort.Sort: missing method Len。
如何根据日期进行排序?
更多关于Golang中如何按日期升序排序Map的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
既然您要先交换再根据键值排序,那么您需要类似这样的代码:The Go Playground
在Go中,map本身是无序的,无法直接排序。你需要将map的键值对提取到切片中,然后根据日期字段进行排序。以下是解决方案:
package main
import (
"fmt"
"sort"
"time"
)
type Record struct {
Charges int `json:"charges"`
FromDates time.Time `json:"from_dates"`
}
func main() {
// 原始数据
data := map[string]Record{
"10": {Charges: 110, FromDates: parseTime("2009-11-30T23:00:00Z")},
"20": {Charges: 120, FromDates: parseTime("2009-11-11T23:00:00Z")},
"30": {Charges: 130, FromDates: parseTime("2009-11-17T23:00:00Z")},
}
// 创建键的切片用于排序
keys := make([]string, 0, len(data))
for k := range data {
keys = append(keys, k)
}
// 根据日期升序排序
sort.Slice(keys, func(i, j int) bool {
return data[keys[i]].FromDates.Before(data[keys[j]].FromDates)
})
// 按排序后的顺序输出
for _, key := range keys {
fmt.Printf("%s: %+v\n", key, data[key])
}
}
func parseTime(s string) time.Time {
t, _ := time.Parse(time.RFC3339, s)
return t
}
如果你需要重新组织数据,可以创建一个新的有序map:
package main
import (
"fmt"
"sort"
"time"
)
type Record struct {
Charges int `json:"charges"`
FromDates time.Time `json:"from_dates"`
}
func main() {
data := map[string]Record{
"10": {Charges: 110, FromDates: parseTime("2009-11-30T23:00:00Z")},
"20": {Charges: 120, FromDates: parseTime("2009-11-11T23:00:00Z")},
"30": {Charges: 130, FromDates: parseTime("2009-11-17T23:00:00Z")},
}
// 创建排序结构
type sortable struct {
key string
record Record
}
slice := make([]sortable, 0, len(data))
for k, v := range data {
slice = append(slice, sortable{key: k, record: v})
}
// 按日期升序排序
sort.Slice(slice, func(i, j int) bool {
return slice[i].record.FromDates.Before(slice[j].record.FromDates)
})
// 创建新的有序map
sortedData := make(map[string]Record)
for i, item := range slice {
// 使用新的键(如"10", "20", "30")或保持原键
newKey := fmt.Sprintf("%d", (i+1)*10)
sortedData[newKey] = item.record
}
fmt.Printf("%+v\n", sortedData)
}
func parseTime(s string) time.Time {
t, _ := time.Parse(time.RFC3339, s)
return t
}
输出结果会按日期升序排列,最早的日期(2009-11-11)对应键"10",中间的日期对应键"20",最晚的日期对应键"30"。

