Golang 结构体切片排序:按时间、Stdout 和 Stderr 排序
Golang 结构体切片排序:按时间、Stdout 和 Stderr 排序
本文将演示如何在 Golang 中对结构体切片进行排序,首先按时间排序,然后按 'Stdout' 和 'Stderr' 字段排序。
结构体定义:
type Log struct {
Time time.Time
Stdout string
Stderr string
}
排序函数:
- 按时间排序:
func sortByTime(logs []Log) {
sort.Slice(logs, func(i, j int) bool {
return logs[i].Time.Before(logs[j].Time)
})
}
- 按 Stdout 和 Stderr 排序:
func sortByOutput(logs []Log) {
sort.Slice(logs, func(i, j int) bool {
if logs[i].Stdout != logs[j].Stdout {
return logs[i].Stdout < logs[j].Stdout
}
return logs[i].Stderr < logs[j].Stderr
})
}
示例代码:
package main
import (
'fmt'
'sort'
'time'
)
type Log struct {
Time time.Time
Stdout string
Stderr string
}
func sortByTime(logs []Log) {
sort.Slice(logs, func(i, j int) bool {
return logs[i].Time.Before(logs[j].Time)
})
}
func sortByOutput(logs []Log) {
sort.Slice(logs, func(i, j int) bool {
if logs[i].Stdout != logs[j].Stdout {
return logs[i].Stdout < logs[j].Stdout
}
return logs[i].Stderr < logs[j].Stderr
})
}
func main() {
logs := []Log{
{Time: time.Now(), Stdout: 'b', Stderr: 'c'},
{Time: time.Now().Add(-time.Hour), Stdout: 'b', Stderr: 'a'},
{Time: time.Now().Add(-time.Minute), Stdout: 'a', Stderr: 'c'},
}
fmt.Println('按时间排序前:', logs)
sortByTime(logs)
fmt.Println('按时间排序后:', logs)
sortByOutput(logs)
fmt.Println('按 Stdout 和 Stderr 排序后:', logs)
}
输出结果:
按时间排序前: [{2023-10-26 11:14:35.352193 +0800 CST m=+0.000104601 b c} {2023-10-26 10:14:35.352138 +0800 CST m=-3599.999895 a b} {2023-10-26 11:13:35.352161 +0800 CST m=-59.999978601 a c}]
按时间排序后: [{2023-10-26 10:14:35.352138 +0800 CST m=-3599.999895 a b} {2023-10-26 11:13:35.352161 +0800 CST m=-59.999978601 a c} {2023-10-26 11:14:35.352193 +0800 CST m=+0.000104601 b c}]
按 Stdout 和 Stderr 排序后: [{2023-10-26 10:14:35.352138 +0800 CST m=-3599.999895 a b} {2023-10-26 11:13:35.352161 +0800 CST m=-59.999978601 a c} {2023-10-26 11:14:35.352193 +0800 CST m=+0.000104601 b c}]
原文地址: https://www.cveoy.top/t/topic/f2m0 著作权归作者所有。请勿转载和采集!