如何使用GoLang对自定义 struct 数组进行排序.

我的代码是:

package main

import "fmt"

type TicketDistribution struct {
    Label        string
    TicketVolume int64
}

type TicketDistributionResponse struct {
    LevelDistribution []*TicketDistribution
}

func main() {
    var response TicketDistributionResponse

    response.LevelDistribution = append(response.LevelDistribution, &TicketDistribution{Label: "John", TicketVolume: 3})
    response.LevelDistribution = append(response.LevelDistribution, &TicketDistribution{Label: "Bill", TicketVolume: 7})
    response.LevelDistribution = append(response.LevelDistribution, &TicketDistribution{Label: "Sam", TicketVolume: 4})

    for _, val := range response.LevelDistribution {
        fmt.Println(*val)
    }

}

这会将输出打印为


{John 3}
{Bill 7}
{Sam 4}

我想按TicketVolume值按降序对response对象进行排序.

在排序之后,响应对象应该如下所示:

{Bill 7}
{Sam 4}
{John 3}

推荐答案

你可以用sort.Slice美元买那个.它接受您的切片和排序函数. 排序函数本身接受两个索引,如果左边的条目是smaller而右边的条目是smaller,则返回TRUE.

这样,您就可以根据自己的自定义标准进行排序.

package main

import (
    "fmt"
    "sort"
)

type TicketDistribution struct {
    Label        string
    TicketVolume int64
}

type TicketDistributionResponse struct {
    LevelDistribution []*TicketDistribution
}

func main() {
    var response TicketDistributionResponse

    response.LevelDistribution = append(response.LevelDistribution, &TicketDistribution{Label: "John", TicketVolume: 3})
    response.LevelDistribution = append(response.LevelDistribution, &TicketDistribution{Label: "Bill", TicketVolume: 7})
    response.LevelDistribution = append(response.LevelDistribution, &TicketDistribution{Label: "Sam", TicketVolume: 4})

    sort.Slice(response.LevelDistribution, func(i, j int) bool {
        a := response.LevelDistribution[i]
        b := response.LevelDistribution[j]
        return a.TicketVolume > b.TicketVolume
    })

    for _, val := range response.LevelDistribution {
        fmt.Println(*val)
    }
}

在比较函数中使用>对切片进行降序排序,对于升序,您将使用<.

Go相关问答推荐

切换选项卡时,Goland IDE中的光标自动转移

将类型定义为泛型类型实例化

在Uber FX中实现后台进程正常关闭的正确方式是什么?

使用Go使用Gorm使用外键对数据进行排序

在nixos上找不到XInput2.h头文件的包

";无效的复制因子;融合Kafka Go客户端

为什么要立即调用内联函数,而不仅仅是调用其包含的函数?

如何从 nil 指针创建值

在 Go 中将元数据从一个 JPEG 复制到另一个

是否可以使用标准库构建 Go 二进制文件?

更改多对多连接表的名称

如何使用名称具有包名称的嵌套 struct 启动 go struct

是否可以从 golang 中的参数推断类型?

为什么不同的 Wireguard 私钥会产生相同的公钥?

如何过滤来自 fsnotify 的重复系统消息

如何在切片增长时自动将切片的新元素添加到函数参数

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

此代码如何生成内存对齐切片?

如何从 docker-compose 命令运行 2 个不同的命令:

行之间的模板交替设计