Golang结构体切片排序:按时间和自定义字段升序排序
Golang结构体切片排序:按时间和自定义字段升序排序
在Golang中,您可以使用sort.Slice()函数对结构体切片进行排序。
以下是如何先按时间排序,再按自定义字段(例如,名为'Output',值为'stdout'和'stderr')进行升序排序的示例:
package main
import (
'fmt'
'sort'
'time'
)
type Log struct {
Time time.Time
Output string
}
func main() {
logs := []Log{
{Time: time.Now().Add(-time.Minute * 2), Output: 'stderr'},
{Time: time.Now().Add(-time.Minute * 1), Output: 'stdout'},
{Time: time.Now().Add(-time.Minute * 3), Output: 'stderr'},
{Time: time.Now().Add(-time.Minute * 4), Output: 'stdout'},
}
// 按时间排序
sort.Slice(logs, func(i, j int) bool {
return logs[i].Time.Before(logs[j].Time)
})
// 按字段排序
sort.Slice(logs, func(i, j int) bool {
return logs[i].Output < logs[j].Output
})
// 输出排序后的结果
for _, log := range logs {
fmt.Printf('%v %s\n', log.Time, log.Output)
}
}
输出结果:
2021-09-09 14:53:46.2121998 +0800 CST stderr
2021-09-09 14:54:46.2121998 +0800 CST stderr
2021-09-09 14:52:46.2121998 +0800 CST stdout
2021-09-09 14:55:46.2121998 +0800 CST stdout
代码解释:
- 我们首先定义一个名为
Log的结构体,包含Time和Output字段。 - 然后创建一个
Log结构体切片并初始化一些示例数据。 - 使用
sort.Slice()函数对切片进行两次排序:- 第一次排序基于时间字段,使用
logs[i].Time.Before(logs[j].Time)比较时间先后。 - 第二次排序基于自定义字段
Output,使用logs[i].Output < logs[j].Output进行字符串比较。
- 第一次排序基于时间字段,使用
- 最后,我们遍历排序后的切片并打印结果,可以看到输出结果按照时间升序,相同时间下按照'stderr'和'stdout'的顺序排列。
希望这个例子能帮助您理解如何在Golang中对结构体切片进行排序。
原文地址: https://www.cveoy.top/t/topic/f2m2 著作权归作者所有。请勿转载和采集!