Golang 自定义结构体排序
注意,本文主要是研究Golang如何自定义结构体排序,而不是Golang具体实现一个排序算法,如快速排序这类的。
使用VSCode编写sort方法,出现的模板如下:
其中SortBy表示定义数据集合,需要自定义数据集,和其他语言不同的是,我们还需要手动设计Len()长度获取函数,Swap()交换函数,以及Less()比较函数,这可谓是相当的让从别的语言过度而来的人感觉不舒服,别的语言都是自定义一个交换规则就行了。
代码参考
依据Id进行从小到大的排序。
package main
import (
"fmt"
"sort"
)
type MyStructType struct {
Id uint
Name string
Date string
}
type SortBy []MyStructType
func (a SortBy) Len() int { return len(a) }
func (a SortBy) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a SortBy) Less(i, j int) bool {
// 基于ID顺序进行排序
return a[i].Id < a[j].Id
}
func main() {
// 如下:为自定义结构体自定义排序规则的例子
// 创建一个结构体数组,并添加数据
var myStructs []MyStructType
myStructs = append(myStructs, MyStructType{Id: 1, Name: "a", Date: "2022-03-17"})
myStructs = append(myStructs, MyStructType{Id: 3, Name: "b", Date: "2022-03-18"})
myStructs = append(myStructs, MyStructType{Id: 2, Name: "c", Date: "2019-03-17"})
myStructs = append(myStructs, MyStructType{Id: 5, Name: "d", Date: "1992-03-17"})
myStructs = append(myStructs, MyStructType{Id: 4, Name: "e", Date: "2022-07-01"})
// 输出结构体
for _, v := range myStructs {
fmt.Println(v)
}
// 对结构体数组进行排序
sort.Sort(SortBy(myStructs))
// 再次输出结构体
for _, v := range myStructs {
fmt.Println(v)
}
}
基于时间的排序规则。
只需要把Less()函数中的时间字符串(常用于从SQL中获取的数据,不得不提Go的这个Time类型和SQL的兼容智能化上实在是太一言难尽了)中的data类型,通过time.Pares()方法进行转换,变成时间类型,再通过Before(),Equal等比较手段进行处理。
例:
func (a SortBy) Less(i, j int) bool {
d1, _ := time.Parse(constant.MysqlDataTimeLayout, a[i].RecordDate)
d2, _ := time.Parse(constant.MysqlDataTimeLayout, a[j].RecordDate)
t1, _ := time.Parse(constant.TimeLayout, a[i].RecordTime)
t2, _ := time.Parse(constant.TimeLayout, a[j].RecordTime)
// 如果时间日期相等,再比较这个日期中的具体时间
if d1.Equal(d2) {
return t1.Before(t2)
} else {
return d1.Before(d2)
}
}
我创建了一个基于反射机制改进的简单自动排序库,目前正在建设中,可以翻阅这篇博客了解详情。
0 条评论