如何使用GoLang对结构体的自定义数组进行排序。
我的代码是:
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}
型
我想对response对象按照TicketVolume值降序排序。
排序后,响应对象应该如下所示:
{Bill 7}
{Sam 4}
{John 3}
型
2条答案
按热度按时间wqnecbli1#
你可以使用
sort.Slice
来实现。它接受你的切片和一个排序函数。sort函数本身接受两个索引,如果左边的项比右边的项小,则返回true。这样您就可以按自己的自定义标准进行排序。
字符串
在comparison函数中使用
>
对切片进行降序排序,对于升序,您可以使用<
。bgtovc5b2#
你也可以使用slice.Interface。你可以通过定义这三个方法为你的结构体实现
sort.Interface
接口。字符串
Performance: Sorting Slice vs Sorting Type (of Slice) with Sort implementation
常规的sort.Slice()和sort.SliceStable()函数可以在任何切片上工作。你必须将slice值作为interface{}值传递,实现必须使用反射(reflect包)来访问它的元素和长度,并执行元素的交换。
相反,当你自己实现sort.Interface类型时,在你的实现中你可以访问你的切片的静态类型,并且你可以提供sort.Interface的实现而不需要reflection,这会使它更快。
下面是更新后的代码
型
下面是基准测试的运行输出,看起来interface/struct方法也更好
型