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

代码解释:

  1. 我们首先定义一个名为Log的结构体,包含TimeOutput字段。
  2. 然后创建一个Log结构体切片并初始化一些示例数据。
  3. 使用sort.Slice()函数对切片进行两次排序:
    • 第一次排序基于时间字段,使用logs[i].Time.Before(logs[j].Time)比较时间先后。
    • 第二次排序基于自定义字段Output,使用logs[i].Output < logs[j].Output进行字符串比较。
  4. 最后,我们遍历排序后的切片并打印结果,可以看到输出结果按照时间升序,相同时间下按照'stderr'和'stdout'的顺序排列。

希望这个例子能帮助您理解如何在Golang中对结构体切片进行排序。

Golang结构体切片排序:按时间和自定义字段升序排序

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

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