Documentation
¶
Index ¶
- Constants
- Variables
- func Group(versions []*Version) map[string]*VersionGroup
- func ReadVersionsStringFromFile(filepath string) ([]string, error)
- func SortVersionGroupSlice(groupSlice []*VersionGroup)
- func SortVersionStringSlice(versionStringSlice []string) []string
- func VisualizeVersionGroups(versions []*Version, w io.Writer)
- func VisualizeVersions(versions []*Version, w io.Writer, maxItems int)
- type ContainsPolicy
- type SortedVersionGroups
- type Version
- type VersionGroup
- func (x *VersionGroup) Add(v *Version) bool
- func (x *VersionGroup) CompareTo(target *VersionGroup) int
- func (x *VersionGroup) Contains(v *Version) bool
- func (x *VersionGroup) ID() string
- func (x *VersionGroup) QueryRangeVersions(start, end *tuple.Tuple2[*Version, ContainsPolicy]) []*Version
- func (x *VersionGroup) SortVersions() []*Version
- func (x *VersionGroup) Versions() []*Version
- type VersionNumbers
- type VersionPrefix
- type VersionStringParser
- type VersionSuffix
Constants ¶
const ( // DefaultVersionDelimiter 默认的版本数字分隔符 // // 这是用于连接版本号数字部分的标准分隔符。即使原始版本使用了其它分隔符(如"/"), // 解析完毕后也会被统一为这个标准分隔符(即".")。 DefaultVersionDelimiter = "." )
Variables ¶
var ( // ErrVersionInvalid 表示版本号格式无效的错误 // // 当尝试解析不符合要求的版本号字符串时返回此错误 ErrVersionInvalid = errors.New("version invalid") )
Functions ¶
func Group ¶
func Group(versions []*Version) map[string]*VersionGroup
Group 对版本号进行分组
该函数将版本对象数组按照其数字部分(主版本号)进行分组,为每个不同的主版本号创建一个版本组。 分组的依据是版本号的数字部分生成的组ID,如 "1.2.3" 和 "1.2.4" 会被分到同一组 "1.2"。
分组可用于: 1. 对特定主版本系列进行管理和查询 2. 分析版本演进路径 3. 查找某主版本下的最新/最旧版本
参数:
- versions: 需要分组的版本对象数组
返回:
- map[string]*VersionGroup: 分组结果,键为版本组ID,值为对应的版本组对象
使用示例:
allVersions := versions.NewVersions("1.0.0", "1.1.0", "1.2.0", "2.0.0", "2.1.0")
groups := versions.Group(allVersions)
// 遍历所有版本组
for groupID, group := range groups {
fmt.Printf("版本组 %s 包含 %d 个版本\n", groupID, len(group.Versions))
// 获取组内最新版本
latestVersion := group.GetLatestVersion()
fmt.Printf("组内最新版本: %s\n", latestVersion.Raw)
}
func ReadVersionsStringFromFile ¶
ReadVersionsStringFromFile 从文件中读取版本号字符串
该函数从指定的文件中读取版本号列表,每行一个版本号,并返回字符串数组。 与 ReadVersionsFromFile 不同,此函数不会将版本号解析为Version对象, 而是保留原始字符串形式,适用于不需要解析和比较的场景。
参数:
- filepath: 包含版本号列表的文件路径
返回:
- []string: 读取的版本号字符串数组
- error: 如果文件读取失败则返回相应错误
使用示例:
// 从版本列表文件中读取版本字符串
versionStrings, err := versions.ReadVersionsStringFromFile("./versions.txt")
if err != nil {
log.Fatalf("读取版本文件失败: %v", err)
}
// 使用版本字符串
for _, vStr := range versionStrings {
fmt.Printf("发现版本: %s\n", vStr)
}
func SortVersionGroupSlice ¶
func SortVersionGroupSlice(groupSlice []*VersionGroup)
SortVersionGroupSlice 对版本组切片进行排序
该函数直接对传入的版本组切片进行原地排序,排序依据是版本组之间的比较规则。
参数:
- groupSlice: 待排序的版本组切片,排序操作直接修改该切片
使用示例:
groups := []*VersionGroup{group1, group2, group3}
SortVersionGroupSlice(groups)
// 现在 groups 已按版本组规则排序
func SortVersionStringSlice ¶
SortVersionStringSlice 对字符串形式的版本数组进行排序
该函数接收一个字符串形式的版本号数组,将其解析为 Version 对象进行排序, 然后将排序结果转换回字符串数组返回。排序遵循版本号的自然排序规则。
参数:
- versionStringSlice: 待排序的版本号字符串数组
返回:
- []string: 排序后的版本号字符串数组
使用示例:
versions := []string{"1.2.0", "1.0.0", "1.10.0", "2.0.0"}
sorted := versions.SortVersionStringSlice(versions)
// 结果: ["1.0.0", "1.2.0", "1.10.0", "2.0.0"]
func VisualizeVersionGroups ¶
VisualizeVersionGroups 可视化版本组之间的关系
此函数将版本组集合转换为可视化的树状文本表示,展示其层次关系。 适合用于查看大型版本库的版本组织结构。
参数:
- versions: 要可视化的版本集合
- w: 输出写入的目标
示例:
versions := ReadVersionsFromFile("versions.txt")
VisualizeVersionGroups(versions, os.Stdout)
func VisualizeVersions ¶
VisualizeVersions 可视化版本号之间的关系和结构
此函数将版本号集合转换为可视化的文本表示,展示其层次关系和排序情况。 主要用于调试、展示或理解版本数据结构。
参数:
- versions: 要可视化的版本集合
- w: 输出写入的目标
- maxItems: 每个版本组最多显示的版本数量,0表示不限制
示例:
versions := ReadVersionsFromFile("versions.txt")
VisualizeVersions(versions, os.Stdout, 5)
Types ¶
type ContainsPolicy ¶
type ContainsPolicy int
ContainsPolicy 用于控制版本查询时的包含/排除策略
该类型定义了在版本过滤或查询操作中,是否应包含或排除特定版本的策略选项。 它作为枚举类型使用,提供了三种可能的状态:未指定、包含和排除。
使用示例:
// 使用包含策略进行版本过滤
filter := &VersionFilter{
Contains: "beta",
ContainsPolicy: ContainsPolicyYes,
}
// 使用排除策略进行版本过滤
filter := &VersionFilter{
Contains: "snapshot",
ContainsPolicy: ContainsPolicyNo,
}
const ( // ContainsPolicyNone 表示未指定包含策略 // // 当设置为此值时,版本查询不会基于包含条件进行过滤 ContainsPolicyNone ContainsPolicy = iota // ContainsPolicyYes 表示包含匹配的版本 // // 当设置为此值时,只有包含指定字符串的版本才会被包含在结果中 ContainsPolicyYes // ContainsPolicyNo 表示排除匹配的版本 // // 当设置为此值时,包含指定字符串的版本将被排除在结果之外 ContainsPolicyNo )
type SortedVersionGroups ¶
type SortedVersionGroups struct {
// contains filtered or unexported fields
}
SortedVersionGroups 表示已排序的版本组集合
SortedVersionGroups 封装了已排序的版本组切片和索引映射, 用于高效地进行版本组查询和范围检索。它通过预先排序和建立索引, 优化了版本组的查找性能。
结构特点: 1. 保持版本组的有序性,便于范围查询 2. 维护组ID到数组索引的映射,支持快速定位 3. 支持基于版本范围的高效查询
使用示例:
// 创建已排序的版本组
allVersions := versions.NewVersions("1.0.0", "1.1.0", "2.0.0", "2.1.0")
sortedGroups := versions.NewSortedVersionGroups(allVersions)
// 执行范围查询
startVer := versions.NewVersion("1.0.0")
endVer := versions.NewVersion("2.0.0")
startTuple := tuple.NewTuple2(startVer, versions.ContainsPolicyYes)
endTuple := tuple.NewTuple2(endVer, versions.ContainsPolicyYes)
rangeResult := sortedGroups.QueryRange(startTuple, endTuple)
func NewSortedVersionGroups ¶
func NewSortedVersionGroups(versions []*Version) *SortedVersionGroups
NewSortedVersionGroups 为版本号创建有序的分组
该方法接收一个版本对象数组,将其分组并排序,返回一个包含已排序版本组的SortedVersionGroups对象。 处理流程: 1. 首先将版本按照其数字部分分组 2. 然后对所有分组进行排序 3. 最后构建组ID到索引的映射,用于快速查找
参数:
- versions: 需要分组和排序的版本对象数组
返回:
- *SortedVersionGroups: 包含已排序版本组的对象
使用示例:
// 创建版本对象数组
allVersions := versions.NewVersions("1.0.0", "1.1.0", "1.2.0", "2.0.0", "2.1.0")
// 创建已排序的版本组
sortedGroups := versions.NewSortedVersionGroups(allVersions)
func (*SortedVersionGroups) GroupIDs ¶
func (x *SortedVersionGroups) GroupIDs() []string
GroupIDs 返回所有版本组的ID列表
该方法返回按顺序排列的版本组ID列表。 返回的ID列表与内部的版本组切片顺序一致,确保保持排序状态。
返回:
- []string: 含有所有版本组ID的字符串切片
使用示例:
sortedGroups := versions.NewSortedVersionGroups(allVersions)
groupIDs := sortedGroups.GroupIDs()
for _, id := range groupIDs {
fmt.Printf("版本组: %s\n", id)
}
func (*SortedVersionGroups) QueryRange ¶
func (x *SortedVersionGroups) QueryRange(start, end *tuple.Tuple2[*Version, ContainsPolicy]) []*Version
QueryRange 在有序版本组中查询指定范围内的版本
该方法根据给定的起始和结束版本范围,返回所有符合条件的版本对象数组。 方法利用预排序的版本组结构,快速定位并收集符合范围条件的版本。
参数:
- start: 包含起始版本和包含策略的元组
- end: 包含结束版本和包含策略的元组
返回:
- []*Version: 符合查询范围条件的版本对象数组
使用示例:
// 创建已排序的版本组
sortedGroups := versions.NewSortedVersionGroups(allVersions)
// 定义查询范围
startVer := versions.NewVersion("1.0.0")
endVer := versions.NewVersion("2.0.0")
startTuple := tuple.NewTuple2(startVer, versions.ContainsPolicyYes) // 包含1.0.0
endTuple := tuple.NewTuple2(endVer, versions.ContainsPolicyNo) // 不包含2.0.0
// 执行范围查询
rangeResult := sortedGroups.QueryRange(startTuple, endTuple)
fmt.Printf("在范围内的版本数: %d\n", len(rangeResult))
type Version ¶
type Version struct {
// Raw 原始的版本号字符串
Raw string `json:"raw"`
// PublicTime 此版本的发布时间
PublicTime time.Time `json:"public_time"`
// VersionNumbers 版本号中的数字部分
// 例如对于版本号 "v1.2.3-beta1",VersionNumbers 为 [1,2,3]
VersionNumbers VersionNumbers `json:"version_numbers"`
// Prefix 版本号数字部分之前的前缀
// 例如对于版本号 "v1.2.3",Prefix 为 "v"
Prefix VersionPrefix `json:"prefix"`
// Suffix 版本号数字部分之后的后缀
// 例如对于版本号 "1.2.3-beta1",Suffix 为 "-beta1"
Suffix VersionSuffix `json:"suffix"`
}
Version 用于表示一个版本号
Version 结构体封装了版本号的各个组成部分,包括原始字符串、发布时间、数字部分、 前缀和后缀。它支持版本号的解析、比较和分组等操作,实现了 Comparable 接口以便 进行版本排序。
一个典型的版本号格式可能为:v1.2.3-beta1,其中: - "v" 是前缀 - "1.2.3" 是数字部分 - "-beta1" 是后缀
使用示例:
// 创建一个版本对象
version := versions.NewVersion("v1.2.3-rc1")
// 检查版本是否有效
if version.IsValid() {
fmt.Printf("版本号有效: %s\n", version.Raw)
fmt.Printf("版本号数字部分: %v\n", version.VersionNumbers)
}
// 比较两个版本
v1 := versions.NewVersion("1.2.3")
v2 := versions.NewVersion("1.3.0")
if v1.CompareTo(v2) < 0 {
fmt.Println("v1 比 v2 旧")
}
func NewVersion ¶
NewVersion 从版本字符串创建一个新的 Version 对象
该方法解析给定的版本字符串,并返回一个填充了相应字段的 Version 对象。 即使版本字符串格式不正确,该方法也会返回一个对象,但其 IsValid() 方法可能返回 false。
参数:
- versionStr: 要解析的版本号字符串,如 "1.2.3" 或 "v1.2.3-rc1"
返回:
- *Version: 解析后的 Version 对象
使用示例:
version := versions.NewVersion("v1.2.3-beta1")
func NewVersionE ¶
NewVersionE 从版本字符串创建一个新的 Version 对象,并返回可能的错误
与 NewVersion 不同,该方法会在版本字符串格式不正确时返回错误。
参数:
- versionStr: 要解析的版本号字符串
返回:
- *Version: 解析后的 Version 对象,如果解析失败则为 nil
- error: 如果版本号无效,则返回 ErrVersionInvalid 错误
使用示例:
version, err := versions.NewVersionE("v1.2.3-beta1")
if err != nil {
log.Fatalf("无效的版本号: %v", err)
}
func NewVersions ¶
NewVersions 批量创建多个 Version 对象
该方法接受多个版本字符串,并返回相应的 Version 对象数组。
参数:
- versionStringSlice: 一个或多个版本号字符串
返回:
- []*Version: 解析后的 Version 对象数组
使用示例:
versions := versions.NewVersions("1.0.0", "1.1.0", "2.0.0")
for _, v := range versions {
fmt.Println(v.Raw)
}
func ReadVersionsFromFile ¶
ReadVersionsFromFile 从文件中读取版本号并解析为Version对象
该函数从指定的文件中读取版本号列表,每行一个版本号,并将其解析为Version对象数组。 函数会自动忽略空行和进行行尾空白字符的清理。
参数:
- filepath: 包含版本号列表的文件路径
返回:
- []*Version: 解析后的Version对象数组
- error: 如果文件读取失败则返回相应错误
示例文件内容:
1.1.28 1.1.29 1.1.30 1.1.31 1.1.31.sec01 1.1.31.sec04 1.1.31.sec06
使用示例:
// 从版本列表文件中读取版本
versions, err := versions.ReadVersionsFromFile("./versions.txt")
if err != nil {
log.Fatalf("读取版本文件失败: %v", err)
}
// 打印解析的版本数
fmt.Printf("共读取 %d 个版本\n", len(versions))
// 对版本进行排序
sortedVersions := versions.SortVersionSlice(versions)
func SortVersionSlice ¶
SortVersionSlice 对版本号对象数组进行排序
该函数实现了版本号的分组排序算法: 1. 首先将版本号按照主版本号分组 2. 对版本组进行排序 3. 在每个组内对版本号进行排序 4. 最后将所有组中的版本号按顺序合并
参数:
- versions: 待排序的版本号对象数组
返回:
- []*Version: 排序后的版本号对象数组
使用示例:
versions := versions.NewVersions("1.2.0", "1.0.0", "1.10.0", "2.0.0")
sorted := versions.SortVersionSlice(versions)
for _, v := range sorted {
fmt.Println(v.Raw)
}
func (*Version) BuildGroupID ¶
BuildGroupID 构造版本所属的组的ID
该方法根据版本号的数字部分生成一个组ID,用于将相似版本分组。
返回:
- string: 表示版本组的ID字符串
使用示例:
version := versions.NewVersion("1.2.3")
groupID := version.BuildGroupID()
fmt.Printf("版本组ID: %s\n", groupID)
func (*Version) CompareTo ¶
CompareTo 比较两个版本号
该方法按以下顺序比较两个版本号: 1. 首先比较主版本号数字部分 2. 其次比较发布时间 3. 然后比较后缀 4. 最后比较原始版本号字符串
参数:
- target: 要比较的目标版本对象
返回:
- int: 如果当前版本小于目标版本,返回-1;如果相等,返回0;如果大于,返回1
使用示例:
v1 := versions.NewVersion("1.0.0")
v2 := versions.NewVersion("1.1.0")
switch v1.CompareTo(v2) {
case -1:
fmt.Println("v1 < v2")
case 0:
fmt.Println("v1 = v2")
case 1:
fmt.Println("v1 > v2")
}
type VersionGroup ¶
type VersionGroup struct {
// GroupVersionNumbers 组的版本号中的数字部分
// 例如对于版本号 "1.2.x",GroupVersionNumbers 为 [1,2]
GroupVersionNumbers VersionNumbers
// VersionMap 组中包含的所有版本,键为版本的原始字符串,值为版本对象
VersionMap map[string]*Version
}
VersionGroup 表示一个版本组,一个版本组中可能有一个或多个版本
VersionGroup 用于管理具有相同主版本号数字部分的一组版本。它提供了版本的添加、查询、排序和范围查询等功能。 版本组是版本管理系统中的重要概念,用于将相似版本聚合在一起,便于进行版本管理和分析。
每个版本组都有一个唯一的ID,由其主版本号数字部分生成,如 "1.2"。
使用示例:
// 创建一个新的版本组
group := versions.NewVersionGroup(versions.NewVersionNumbers([]int{1, 2}))
// 添加版本到组中
v1 := versions.NewVersion("1.2.0")
v2 := versions.NewVersion("1.2.1")
group.Add(v1)
group.Add(v2)
// 获取组中的所有版本
allVersions := group.Versions()
// 获取排序后的版本
sortedVersions := group.SortVersions()
func NewVersionGroup ¶
func NewVersionGroup(groupVersionNumbers VersionNumbers) *VersionGroup
NewVersionGroup 创建一个新的版本组
该方法根据指定的版本号数字部分创建一个新的版本组。创建时需要传递能够在包范围下唯一区分组的组ID, 这个ID选择的是版本中的数字部分。
参数:
- groupVersionNumbers: 版本组的数字部分,如 [1,2] 表示 "1.2" 版本组
返回:
- *VersionGroup: 新创建的版本组对象
使用示例:
// 创建表示 "1.2" 版本组的对象
group := versions.NewVersionGroup(versions.NewVersionNumbers([]int{1, 2}))
func NewVersionGroupFromVersions ¶
func NewVersionGroupFromVersions(versions []*Version) *VersionGroup
NewVersionGroupFromVersions 从版本数组创建一个版本组
该方法基于给定的版本数组创建一个版本组。所有版本将被添加到同一个组中, 该组的数字部分取自第一个版本的数字部分。
参数:
- versions: 要添加到组中的版本数组
返回:
- *VersionGroup: 新创建的包含所有指定版本的版本组,如果输入为空则返回 nil
使用示例:
versions := versions.NewVersions("1.2.0", "1.2.1", "1.2.2")
group := versions.NewVersionGroupFromVersions(versions)
func SortVersionGroupMap ¶
func SortVersionGroupMap(versionGroupMap map[string]*VersionGroup) []*VersionGroup
SortVersionGroupMap 对版本组映射进行排序
该函数将版本组映射转换为切片,并对切片中的版本组进行排序。
参数:
- versionGroupMap: 版本组映射,键为版本组ID,值为版本组对象
返回:
- []*VersionGroup: 排序后的版本组切片
使用示例:
groupMap := Group(versions)
sortedGroups := SortVersionGroupMap(groupMap)
for _, group := range sortedGroups {
fmt.Printf("组: %s, 版本数: %d\n", group.GroupID, len(group.Versions))
}
func (*VersionGroup) Add ¶
func (x *VersionGroup) Add(v *Version) bool
Add 把给定的版本添加到本版本组中
该方法将指定的版本添加到版本组中。如果版本已存在,则会被覆盖。
参数:
- v: 要添加的版本对象
返回:
- bool: 如果版本之前已存在于组中则返回 true,否则返回 false
使用示例:
group := versions.NewVersionGroup(versions.NewVersionNumbers([]int{1, 2}))
version := versions.NewVersion("1.2.3")
exists := group.Add(version)
if !exists {
fmt.Println("添加了新版本")
}
func (*VersionGroup) CompareTo ¶
func (x *VersionGroup) CompareTo(target *VersionGroup) int
CompareTo 比较两个版本组的大小
该方法通过比较版本组的数字部分来确定两个版本组的先后顺序。
参数:
- target: 要比较的目标版本组
返回:
- int: 如果当前版本组小于目标版本组,返回负数;如果相等,返回0;如果大于,返回正数
使用示例:
group1 := versions.NewVersionGroup(versions.NewVersionNumbers([]int{1, 2}))
group2 := versions.NewVersionGroup(versions.NewVersionNumbers([]int{1, 3}))
if group1.CompareTo(group2) < 0 {
fmt.Println("group1 比 group2 旧")
}
func (*VersionGroup) Contains ¶
func (x *VersionGroup) Contains(v *Version) bool
Contains 判断本版本组中是否包含给定的版本
该方法检查指定的版本是否已存在于版本组中。
参数:
- v: 要检查的版本对象
返回:
- bool: 如果版本存在于组中则返回 true,否则返回 false
使用示例:
group := versions.NewVersionGroup(versions.NewVersionNumbers([]int{1, 2}))
version := versions.NewVersion("1.2.3")
if !group.Contains(version) {
group.Add(version)
}
func (*VersionGroup) ID ¶
func (x *VersionGroup) ID() string
ID 返回组的ID
该方法返回版本组的唯一标识符,由其数字部分生成。
返回:
- string: 版本组的ID,例如 "1.2"
使用示例:
group := versions.NewVersionGroup(versions.NewVersionNumbers([]int{1, 2}))
groupID := group.ID() // 返回 "1.2"
func (*VersionGroup) QueryRangeVersions ¶
func (x *VersionGroup) QueryRangeVersions(start, end *tuple.Tuple2[*Version, ContainsPolicy]) []*Version
QueryRangeVersions 获取组内指定区间内的版本
该方法根据给定的起始和结束版本范围,返回组内符合条件的版本数组。 版本的包含性由 ContainsPolicy 参数控制。
参数:
- start: 包含起始版本和包含策略的元组
- end: 包含结束版本和包含策略的元组
返回:
- []*Version: 符合区间条件的版本数组
使用示例:
group := versions.NewVersionGroupFromVersions(versions.NewVersions("1.2.0", "1.2.1", "1.2.2", "1.2.3"))
// 查询 1.2.0(包含)到 1.2.2(包含)的版本
startTuple := tuple.NewTuple2(versions.NewVersion("1.2.0"), versions.ContainsPolicyYes)
endTuple := tuple.NewTuple2(versions.NewVersion("1.2.2"), versions.ContainsPolicyYes)
rangeVersions := group.QueryRangeVersions(startTuple, endTuple)
// 结果包含: ["1.2.0", "1.2.1", "1.2.2"]
func (*VersionGroup) SortVersions ¶
func (x *VersionGroup) SortVersions() []*Version
SortVersions 对组下的所有版本进行排序返回
该方法返回版本组中所有版本的有序数组,排序遵循版本号的自然排序规则。
返回:
- []*Version: 排序后的版本数组
使用示例:
group := versions.NewVersionGroupFromVersions(versions.NewVersions("1.2.2", "1.2.0", "1.2.1"))
sortedVersions := group.SortVersions()
// 结果顺序: ["1.2.0", "1.2.1", "1.2.2"]
func (*VersionGroup) Versions ¶
func (x *VersionGroup) Versions() []*Version
Versions 返回组下的所有版本
该方法返回版本组中包含的所有版本的数组,结果不保证有序。
返回:
- []*Version: 版本组中所有版本的数组
使用示例:
group := versions.NewVersionGroupFromVersions(versions.NewVersions("1.2.0", "1.2.1"))
allVersions := group.Versions()
fmt.Printf("组中包含 %d 个版本\n", len(allVersions))
type VersionNumbers ¶
type VersionNumbers []int
VersionNumbers 表示版本号中的数字部分
VersionNumbers 是一个整数切片类型,用于表示和操作版本号的数字部分。 例如对于版本号 "v1.2.3-beta1",其 VersionNumbers 为 [1,2,3]。 它实现了 Comparable 接口,支持版本号数字部分的比较操作。
使用示例:
// 创建一个版本号数字部分
numbers := versions.NewVersionNumbers([]int{1, 2, 3})
// 获取版本组ID
groupID := numbers.BuildGroupID() // 返回 "1.2.3"
// 比较两个版本号数字部分
other := versions.NewVersionNumbers([]int{1, 3, 0})
if numbers.CompareTo(other) < 0 {
fmt.Println("1.2.3 比 1.3.0 旧")
}
func NewVersionNumbers ¶
func NewVersionNumbers(versionNumbers []int) VersionNumbers
NewVersionNumbers 创建一个新的 VersionNumbers 对象
该方法将整数切片转换为 VersionNumbers 类型,便于进行版本号相关操作。
参数:
- versionNumbers: 表示版本号的整数切片,如 [1,2,3] 表示版本号 "1.2.3"
返回:
- VersionNumbers: 一个新的 VersionNumbers 对象
使用示例:
numbers := versions.NewVersionNumbers([]int{1, 2, 3})
func (VersionNumbers) BuildGroupID ¶
func (x VersionNumbers) BuildGroupID() string
BuildGroupID 根据版本号数字部分构造版本组的ID
该方法将版本号数字部分以默认分隔符(".")连接成字符串,用于表示版本组ID。 版本组ID可用于对相同主版本号的版本进行分组和管理。
返回:
- string: 版本组ID字符串,例如 "1.2.3"
使用示例:
numbers := versions.NewVersionNumbers([]int{1, 2, 3})
groupID := numbers.BuildGroupID() // 返回 "1.2.3"
// 可用于版本分组
versionGroups := make(map[string][]*Version)
for _, version := range allVersions {
groupID := version.VersionNumbers.BuildGroupID()
versionGroups[groupID] = append(versionGroups[groupID], version)
}
func (VersionNumbers) CompareTo ¶
func (x VersionNumbers) CompareTo(target []int) int
CompareTo 比较两个版本号数字部分的大小
该方法按照版本号比较规则,从左到右逐位比较两个版本号数字部分的大小。 对于不同长度的版本号,首先比较共有部分,如果共有部分相等,则较长的版本号更大。
参数:
- target: 要比较的目标版本号数字部分
返回:
- int: 如果当前版本小于目标版本,返回负数;如果相等,返回0;如果大于,返回正数
使用示例:
v1 := versions.NewVersionNumbers([]int{1, 0, 0})
v2 := versions.NewVersionNumbers([]int{1, 1, 0})
result := v1.CompareTo(v2)
if result < 0 {
fmt.Println("v1 比 v2 旧")
} else if result > 0 {
fmt.Println("v1 比 v2 新")
} else {
fmt.Println("v1 和 v2 相等")
}
type VersionPrefix ¶
type VersionPrefix string
VersionPrefix 表示版本中数字部分之前的部分
VersionPrefix 是一个字符串类型,用于表示和操作版本号的前缀部分。 在版本号格式中,前缀是位于数字部分之前的字符串,如 "v1.2.3" 中的 "v"。 前缀可以为空,表示版本号直接以数字部分开始,如 "1.2.3"。
使用示例:
// 检查前缀是否为空
prefix := versions.VersionPrefix("v")
if !prefix.IsEmpty() {
fmt.Printf("版本前缀: %s\n", prefix)
}
// 在解析版本号时处理前缀
version := versions.NewVersion("v1.2.3")
fmt.Printf("版本 %s 的前缀是: %s\n", version.Raw, version.Prefix)
const EmptyVersionPrefix VersionPrefix = ""
EmptyVersionPrefix 表示一个空的前缀
该常量用于表示版本号没有前缀的情况,如纯数字版本号 "1.2.3"。 它也用于检查版本前缀是否为空。
func (VersionPrefix) IsEmpty ¶
func (x VersionPrefix) IsEmpty() bool
IsEmpty 返回前缀是否为空
该方法检查版本前缀是否为空,即是否等于 EmptyVersionPrefix。
返回:
- bool: 如果前缀为空则返回 true,否则返回 false
使用示例:
version := versions.NewVersion("1.2.3") // 没有前缀
if version.Prefix.IsEmpty() {
fmt.Println("版本没有前缀")
}
version2 := versions.NewVersion("v1.2.3") // 有前缀
if !version2.Prefix.IsEmpty() {
fmt.Printf("版本前缀是: %s\n", version2.Prefix)
}
type VersionStringParser ¶
type VersionStringParser struct {
// contains filtered or unexported fields
}
VersionStringParser 把版本从字符串形式解析为struct
VersionStringParser 负责将版本号字符串解析为结构化的 Version 对象。 它实现了版本号字符串的词法分析,将字符串划分为前缀、数字部分和后缀三个组成部分。
解析过程: 1. 首先识别和提取版本号的前缀部分(如 "v") 2. 然后识别和提取版本号的数字部分(如 "1.2.3") 3. 最后识别和提取版本号的后缀部分(如 "-beta1")
使用示例:
// 创建一个版本解析器
parser := versions.NewVersionStringParser("v1.2.3-beta1")
// 解析版本字符串
version := parser.Parse()
// 使用解析结果
fmt.Printf("前缀: %s\n", version.Prefix)
fmt.Printf("数字部分: %v\n", version.VersionNumbers)
fmt.Printf("后缀: %s\n", version.Suffix)
func NewVersionStringParser ¶
func NewVersionStringParser(versionStr string) *VersionStringParser
NewVersionStringParser 创建一个版本号Parser
该方法创建一个新的版本号解析器实例。每次解析都需要重新创建新的Parser, 因为解析状态保存在Parser对象中。
参数:
- versionStr: 要解析的版本号字符串
返回:
- *VersionStringParser: 新创建的版本号解析器
使用示例:
parser := versions.NewVersionStringParser("v1.2.3-rc1")
version := parser.Parse()
func (*VersionStringParser) IsDigit ¶
func (x *VersionStringParser) IsDigit(c rune) bool
IsDigit 判断是否是数字
该方法检查给定的字符是否为数字字符(0-9)。
参数:
- c: 要检查的字符
返回:
- bool: 如果是数字则返回 true,否则返回 false
func (*VersionStringParser) IsVersionNumberDelimiter ¶
func (x *VersionStringParser) IsVersionNumberDelimiter(c rune) bool
IsVersionNumberDelimiter 判断是否是版本数字的分隔符
该方法检查给定的字符是否为版本号数字部分的分隔符(目前仅支持点号)。
参数:
- c: 要检查的字符
返回:
- bool: 如果是分隔符则返回 true,否则返回 false
func (*VersionStringParser) Parse ¶
func (x *VersionStringParser) Parse() *Version
Parse 解析版本号字符串
该方法按照预定义的规则解析版本号字符串,提取前缀、数字部分和后缀, 并构造一个完整的 Version 对象返回。
返回:
- *Version: 解析后的版本对象
使用示例:
parser := versions.NewVersionStringParser("v1.2.3-beta1")
version := parser.Parse()
fmt.Printf("版本号: %s\n", version.Raw)
type VersionSuffix ¶
type VersionSuffix string
VersionSuffix 表示版本号的后缀,版本号中数字后面的部分
VersionSuffix 是一个字符串类型,用于表示和操作版本号的后缀部分。 在版本号格式中,后缀是位于数字部分之后的字符串,如 "1.2.3-beta1" 中的 "-beta1"。 后缀通常用于表示预发布版本、构建元数据或其他版本标识信息。
后缀可以为空,表示版本号仅包含数字部分,如 "1.2.3"。
使用示例:
// 检查后缀是否为空
suffix := versions.VersionSuffix("-beta1")
if !suffix.IsEmpty() {
fmt.Printf("版本后缀: %s\n", suffix)
}
// 比较后缀的优先级
suffix1 := versions.VersionSuffix("-alpha")
suffix2 := versions.VersionSuffix("-beta")
if suffix1.CompareTo(suffix2) < 0 {
fmt.Println("alpha 后缀的优先级低于 beta 后缀")
}
const EmptyVersionSuffix VersionSuffix = ""
EmptyVersionSuffix 空的后缀
该常量用于表示版本号没有后缀的情况,如纯数字版本号 "1.2.3"。 它也用于检查版本后缀是否为空。
func (VersionSuffix) CompareTo ¶
func (x VersionSuffix) CompareTo(target VersionSuffix) int
CompareTo 比较两个版本后缀的优先级
该方法根据字典序比较两个版本后缀的优先级。目前使用简单的字符串比较, 未来计划引入权重系统,为不同类型的后缀(如 alpha、beta、rc)分配不同的权重。
参数:
- target: 要比较的目标版本后缀
返回:
- int: 如果当前后缀优先级低于目标后缀,返回-1;如果相等,返回0;如果高于,返回1
使用示例:
suffix1 := versions.VersionSuffix("-alpha1")
suffix2 := versions.VersionSuffix("-beta1")
result := suffix1.CompareTo(suffix2)
if result < 0 {
fmt.Println("alpha1 后缀的优先级低于 beta1 后缀")
}
注意:
- TODO 2023-5-16 17:26:02 未来将引入后缀权重系统,使不同类型后缀的比较更符合语义化版本规范
func (VersionSuffix) IsEmpty ¶
func (x VersionSuffix) IsEmpty() bool
IsEmpty 判断版本后缀是否为空
该方法检查版本后缀是否为空,即是否等于 EmptyVersionSuffix。
返回:
- bool: 如果后缀为空则返回 true,否则返回 false
使用示例:
version := versions.NewVersion("1.2.3") // 没有后缀
if version.Suffix.IsEmpty() {
fmt.Println("版本没有后缀")
}
version2 := versions.NewVersion("1.2.3-rc1") // 有后缀
if !version2.Suffix.IsEmpty() {
fmt.Printf("版本后缀是: %s\n", version2.Suffix)
}