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)
	}
}
我创建了一个基于反射机制改进的简单自动排序库,目前正在建设中,可以翻阅这篇博客了解详情。
分类: Go

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注