前言:
Go 语言中排序主要使用的sort库,对于常见数据类型string, int ,float构成的Slice,可以使用sort库对应的sort.Strings() / sort.Ints() / sort.Float64s()直接排序,但是对于复杂类型struct构成的Slice,要对其排序就需要自己实现其三个方法(Len, Swap,Less)。
问题在于:一个结构体我可以给他写三个方法,那10个结构体我得写30个方法?
这一定是不合理的,办法总比困难多,本文结合 【WangC.W】-- go语言的排序、结构体排序 一文以及自己的理解实现了一套通用的golang排序写法。
正文:
package mainimport ("fmt""sort"
)//待排序的结构体
type City struct {Name stringNumber intTest bool
}//待排序的结构体
type Animal struct {Name string // 名字Height float32 // 高度Weight float32 //体重
}//定义一个通用的结构体
type Bucket struct {Slice []interface{} //承载以任意结构体为元素构成的SliceBy func(a,b interface{})bool //排序规则函数,当需要对新的结构体slice进行排序时,只需定义这个函数即可
}
/*
定义三个必须方法的准则:接收者不能为指针
*/
func (this Bucket)Len()int { return len(this.Slice)}func (this Bucket)Swap(i,j int){ this.Slice[i],this.Slice[j] = this.Slice[j],this.Slice[i] }func (this Bucket)Less(i,j int)bool { return this.By(this.Slice[i], this.Slice[j]) }func main() {//对第一个结构体排序c1 := City{"Los Angeles",1024, true}c2 := City{"Wellington",128,false}c3 := City{"Seattle",64,false}//定义专属的排序函数city_by := func(a,b interface{})bool {return a.(City).Number > b.(City).Number //按年龄排倒序}citys := Bucket{}citys.Slice = append(citys.Slice, c1,c2,c3)citys.By = city_bysort.Sort(citys)fmt.Printf("%+v\n", citys.Slice)/***************对第二个结构体排序*****************/a1 := Animal{"pigeon",0.15,3}a2 := Animal{"sheep",1,20}a3 := Animal{"giraffe",3,70}//定义结构体Animal的专属排序函数 -- 关键代码animal_by := func(a,b interface{})bool {return a.(Animal).Weight > b.(Animal).Weight //按体重排倒序}animals := Bucket{}animals.Slice = append(animals.Slice, a1,a2,a3)animals.By = animal_by // -- 关键代码sort.Sort(animals) // -- 关键代码fmt.Printf("%+v\n", animals.Slice) //已排序的slice
}
再次感谢【WangC.W】-- go语言的排序、结构体排序 。