Skip to content

分组与聚合

把版本号按数字部分归组:数字段完全相同的版本归入同一组(后缀不影响分组)。

🗃 简单分组

go
vs := versions.NewVersions(
	"1.0.0", "1.0.0-rc1", "1.0.0-beta1",  // 数字段都是 [1,0,0] → 同组 "1.0.0"
	"1.1.0",                                // [1,1,0] → 组 "1.1.0"
	"2.0.0",                                // [2,0,0] → 组 "2.0.0"
)

groups := versions.Group(vs) // map[string]*VersionGroup

for id, g := range groups {
	fmt.Printf("%s: %d 个版本,最新 %s\n", id, g.Count(), g.GetLatest().Raw)
}
// 1.0.0: 3 个版本,最新 1.0.0(正式版 > 预发布版)
// 1.1.0: 1 个版本,最新 1.1.0
// 2.0.0: 1 个版本,最新 2.0.0

分组 ID = BuildGroupID(),把数字段点号全部拼接[1,0,0]"1.0.0")。详见 分组语义

数字段相同才同组

1.0.01.0.1 数字段不同([1,0,0] vs [1,0,1]),是不同分组。只有 1.0.01.0.0-rc1 这种数字段相同、仅后缀不同的版本才归同组。

📊 组内聚合

go
g := groups["1.0.0"]
g.GetLatest().Raw        // 1.0.0(正式版最新)
g.GetOldest().Raw        // 1.0.0-beta1(beta < rc < 正式)
g.LatestStable().Raw     // 1.0.0
g.LatestPrerelease().Raw // 1.0.0-rc1
g.StableVersions()       // [1.0.0]
g.PrereleaseVersions()   // [1.0.0-beta1, 1.0.0-rc1]

⚡ 有序索引(范围查询)

当版本量大、需多次范围查询时,用 SortedVersionGroups 一次构建、多次查询:

go
svg := versions.NewSortedVersionGroups(vs)

svg.GroupIDs() // ["1.0" "1.1" "2.0"] 已排序
svg.Contains("1.1") // true

// 范围查询:取 1.0 ~ 2.0 之间的版本
// QueryRange 接受 *tuple.Tuple2[*Version, ContainsPolicy] 作为起止端点
inRange := svg.QueryRange(start, end)

端点 *tuple.Tuple2[*Version, ContainsPolicy] 来自 github.com/golang-infrastructure/go-tuple,详见 QueryRange范围与包含策略

🚀 下一步

基于 MIT 协议发布