golang struct数组排序_golang struct数组通用排序

因为自定义的结构体数组需要重新实现 Len() Swap() Less()函数,这样只要有个新的结构体数组就需要再copy一遍代码,投机之后就有了以下“一劳永逸”的代码,结构体再多也不“通用”。

//通用排序

//结构体排序,必须重写数组Len() Swap() Less()函数

type body_wrapper struct {

Bodys [] interface{}

by func(p,q*interface{}) bool //内部Less()函数会用到

}

type SortBodyBy func(p, q* interface{}) bool //定义一个函数类型

//数组长度Len()

func (acw body_wrapper) Len() int {

return len(acw.Bodys)

}

//元素交换

func (acw body_wrapper) Swap(i,j int){

acw.Bodys[i],acw.Bodys[j] = acw.Bodys[j],acw.Bodys[i]

}

//比较函数,使用外部传入的by比较函数

func (acw body_wrapper) Less(i,j int) bool {

return acw.by(&acw.Bodys[i],&acw.Bodys[j])

}

//自定义排序字段,参考SortBodyByCreateTime中的传入函数

func SortBody(bodys [] interface{}, by SortBodyBy){

sort.Sort(body_wrapper{bodys,by})

}

//按照createtime排序,需要注意是否有createtime

func SortBodyByCreateTime(bodys [] interface{}){

sort.Sort(body_wrapper{bodys,func(p,q * interface{}) bool{

v :=reflect.ValueOf(*p)

i := v.FieldByName("Create_time")

v =reflect.ValueOf(*q)

j := v.FieldByName("Create_time")

return i.String() > j.String()

}})

}

较之一般的结构体数组排序,这里结合了结构体映射去做了排序,所以无需关心结构体类型;

使用方式:

type User struct {

Name string `json:"name"`

Create_time string `json:"create_time"`

}

func main() {

results := []interface{}{} //这里必须定义成[]interface{}{}

u1 := User{

Name:"lxw",

Create_time:"2018-02-01",

}

u2 := User{

Name:"zll",

Create_time:"2018-03-01",

}

results = append(results,u1)

results = append(results,u2)

//使用定义好的排序

SortBodyByCreateTime(results)

fmt.Println(results)

// 使用自定义的字段排序

SortBody(results,func(p,q * interface{}) bool{

v :=reflect.ValueOf(*p)

i := v.FieldByName("Name")

v =reflect.ValueOf(*q)

j := v.FieldByName("Name")

return i.String() < j.String()

})

fmt.Println(results)

}

输出结果如下:

[{ zll 2018-03-01} { lxw 2018-02-01}]

[{ lxw 2018-02-01} { zll 2018-03-01}]

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值