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)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
在结果返回的地方,直接调用此方法即可实现按时间排序:
sort.Sort(ByTime{data}) // 基于创建时间字段进行排序
1
网上的文章,如果字段是 int 类型时的排序方式:golang 对自定义类型排序 (opens new window)
上次更新: 2024/12/05, 21:39:23