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

### Golang 中对数组进行排序 在 Go 语言中,可以利用内置的 `sort` 包来进行数组或切片的排序操作。对于基本类型的数组(如整数、字符串),可以直接调用相应的接口完成排序;而对于复杂数据类型(比如由结构体组成的数组),则需指定比较逻辑。 #### 对于结构体数组排序 当处理的是结构体数组时,可以通过 `sort.Slice()` 或者 `sort.SliceStable()` 函数来实现基于特定字段的排序[^2]。下面是一个具体的例子: ```go package main import ( "fmt" "sort" ) func main() { slStdnt := []struct { Name string Age int Height int }{ {"Alice", 23, 175}, {"David", 18, 185}, {"Eve", 18, 165}, {"Bob", 25, 170}, } sort.SliceStable(slStdnt, func(i, j int) bool { return slStdnt[i].Age < slStdnt[j].Age }) fmt.Println(slStdnt) } ``` 这段代码展示了如何创建一个包含多个学生信息(姓名、年龄和身高)的结构体数组,并依据学生的年龄从小到大对其进行稳定排序。所谓“稳定”,意味着如果两个元素的关键字相同,则它们相对位置不会改变。 #### 基本类型数组排序 除了结构体外,针对简单的数值型或其他可比较的数据类型构成的一维数组/切片,也可以很方便地应用 `sort.Ints()` 等预定义好的辅助函数直接执行升序排列[^4]。 ```go nums := []int{5, 2, 9, 1, 5, 6} sort.Ints(nums) fmt.Println(nums) // 输出: [1 2 5 5 6 9] ``` 此段程序片段说明了怎样快速有效地对一组整数按递增顺序整理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值