go结构体字段排序

文章展示了如何在Go语言中对结构体数组进行排序,首先是一个简单的单字段(Count)降序排序的例子,然后扩展到多字段排序,当Count相同时,根据Age字段进行降序排序。

//结构体单字段排序

type Info struct {
	Count float64 `json:"count"`
	Age float64 `json:"age"`
}
type Infos []Info
// 重写 Len() 方法
func (a Infos) Len() int {
	return len(a)
}
// 重写 Swap() 方法
func (a Infos) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}
// 重写 Less() 方法, info结构体count字段从大到小排序
func (a Infos) Less(i, j int) bool {
	return a[j].Count < a[i].Count
}

func main() {
	var infos1 []Info
	infos1 = append(infos1,Info{Count: 1,Age: 2})
	infos1 = append(infos1,Info{Count: 2,Age: 2})
	infos1 = append(infos1,Info{Count: 6,Age: 3})
	infos1 = append(infos1,Info{Count: 8,Age: 4})
	Print(infos1)
	fmt.Println("排序后")
	sort.Sort(Infos(infos1))
	Print(infos1)
}
func Print(infos1 []Info)  {
	for k,v :=range infos1{
		fmt.Println(k,",",v)

	}
}

结构体多字段排序

type Info struct {
	Count float64 `json:"count"`
	Age float64 `json:"age"`
}
type Dates struct {
	Infos []*Info
	by func(p, q * Info) bool
}
// 重写 Len() 方法
func (pw Dates) Len() int {
	return len(pw.Infos)
}
// 重写 Swap() 方法
func (pw Dates) Swap(i, j int){
	pw.Infos[i], pw.Infos[j] = pw.Infos[j], pw.Infos[i]
}
// 重写 Less() 方法
func (pw Dates) Less(i, j int) bool {
	return pw.by(pw.Infos[i], pw.Infos[j])
}


func main() {
	var infos1 []*Info
	Info1 := &Info{Count: 1,Age: 2}
	Info2 := &Info{Count: 2,Age: 2}
	Info3 := &Info{Count: 0,Age: 4}
	Info4 := &Info{Count: 0,Age: 5}
	infos1 = append(infos1,Info1)
	infos1 = append(infos1,Info2)
	infos1 = append(infos1,Info3)
	infos1 = append(infos1,Info4)
	Print(infos1)
	sort.Sort(Dates{infos1, func (p, q *Info) bool {
	//在info结构体count字段不相等的情况下,按照count从大到小排序
	if p.Count != q.Count{
		return p.Count > q.Count
	}
		//在info结构体count字段相等的情况下,按照age从大到小排序
		return p.Age > q.Age

	}})
	fmt.Println("排序后")
	Print(infos1)
}
func Print(infos1 []*Info)  {
	for k,v :=range infos1{
		fmt.Println(k,",",v)

	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值