Golang 结构体切片排序:按时间、Stdout 和 Stderr 排序

本文将演示如何在 Golang 中对结构体切片进行排序,首先按时间排序,然后按 'Stdout' 和 'Stderr' 字段排序。

结构体定义:

type Log struct {
    Time   time.Time
    Stdout string
    Stderr string
}

排序函数:

  1. 按时间排序:
func sortByTime(logs []Log) {
    sort.Slice(logs, func(i, j int) bool {
        return logs[i].Time.Before(logs[j].Time)
    })
}
  1. 按 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}]
Golang 结构体切片排序:按时间、Stdout 和 Stderr 排序

原文地址: https://www.cveoy.top/t/topic/f2m0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录