如何在GoLang中按TicketVolume降序排序自定义结构体数组?
在Go中对自定义结构体数组进行降序排序的方法
要给你的TicketDistribution结构体指针数组按TicketVolume降序排序,直接用Go标准库的sort包就能实现,最简洁的方式是使用sort.Slice函数,不需要额外定义排序类型。
修改后的完整代码
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}) // 按TicketVolume降序排序 sort.Slice(response.LevelDistribution, func(i, j int) bool { return response.LevelDistribution[i].TicketVolume > response.LevelDistribution[j].TicketVolume }) for _, val := range response.LevelDistribution { fmt.Println(*val) } }
关键说明
- 先导入
sort包,这是Go标准库中负责排序的工具包。 sort.Slice函数接收两个参数:要排序的切片,以及一个自定义的less函数。- 这里的
less函数定义了排序规则:当第i个元素的TicketVolume大于第j个元素时,i排在j前面,以此实现降序排序。如果要升序,把>换成<即可。
运行结果
{Bill 7} {Sam 4} {John 3}
另一种复用性更强的方式:实现sort.Interface接口
如果需要多次使用相同排序逻辑,可以给切片类型实现sort.Interface接口(包含Len()、Less()、Swap()三个方法),示例如下:
// 定义自定义切片类型 type TicketDistributionSlice []*TicketDistribution // 实现sort.Interface的Len方法 func (t TicketDistributionSlice) Len() int { return len(t) } // 实现Less方法,定义降序规则 func (t TicketDistributionSlice) Less(i, j int) bool { return t[i].TicketVolume > t[j].TicketVolume } // 实现Swap方法 func (t TicketDistributionSlice) Swap(i, j int) { t[i], t[j] = t[j], t[i] } // 在main函数中这样调用排序: sort.Sort(TicketDistributionSlice(response.LevelDistribution))
这种方式适合需要重复使用相同排序规则的场景。
内容的提问来源于stack exchange,提问作者Byte
相关产品推荐
相关产品推荐

