@@ -1,58 +0,0 @@ 04.golang以结构体中某个字段进行排序 | 凤凰涅槃进阶之路

04.golang以结构体中某个字段进行排序

Abel sun2023年1月6日约 409 字大约 1 分钟

04.golang以结构体中某个字段进行排序

我写了一个脚本获取项目在harbor中的tag列表,经过一些curl测试之后,很快就完成了这个脚本的编写。

接下来需要做一些优化方面的考量。

首先一个问题是,返回的结果的顺序好像是随机的,这不是我想要的,通常,当我利用此脚本查项目可用的tag时,我的诉求可能更倾向于获取它最新push的tag,于是,就有了一个在内存中对列表排序的需求。

经过一番搜索,发现官方提供的sort包,直接使用能够对简单的列表进行排序,如果是结构体中的某个字段,则可以用如下方式定义方法:

// Tags harbor项目tag的对象
type Tags struct {
 Digest        string    `json:"digest"`
 Name          string    `json:"name"`
 Size          int       `json:"size"`
 Architecture  string    `json:"architecture"`
 Os            string    `json:"os"`
 OsVersion     string    `json:"os.version"`
 DockerVersion string    `json:"docker_version"`
 Author        string    `json:"author"`
 Created       time.Time `json:"created"`
 Config        struct {
  Labels interface{} `json:"labels"`
 } `json:"config"`
 Signature interface{}   `json:"signature"`
 Labels    []interface{} `json:"labels"`
 PushTime  time.Time     `json:"push_time"`
 PullTime  time.Time     `json:"pull_time"`
}

// 基于时间字段进行排序功能
type tags []Tags

func (s tags) Len() int {
 return len(s)
}
func (s tags) Swap(i, j int) {
 s[i], s[j] = s[j], s[i]
}

type ByTime struct {
 tags
}

func (b ByTime) Less(i, j int) bool {
 return b.tags[i].Created.Before(b.tags[j].Created)
}

在结果返回的地方,直接调用此方法即可实现按时间排序:

sort.Sort(ByTime{data}) // 基于创建时间字段进行排序

网上的文章,如果字段是int类型时的排序方式:golang对自定义类型排序open in new window

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.9.1