Files
2024-04-13 10:56:17 +08:00

77 lines
1.9 KiB
Go

package versionx
import (
"errors"
"strconv"
"strings"
)
// 定义一个结构体,表示版本号
type Version struct {
Major int // 主版本号
Minor int // 次版本号
Patch int // 补丁版本号
}
// 定义一个方法,比较两个版本号的大小
// 返回值为 -1, 0, 1 分别表示 v 小于, 等于, 大于 other
func (v Version) Compare(other Version) int {
if v.Major < other.Major {
return -1
}
if v.Major > other.Major {
return 1
}
// 如果主版本号相同,比较次版本号
if v.Minor < other.Minor {
return -1
}
if v.Minor > other.Minor {
return 1
}
// 如果次版本号相同,比较补丁版本号
if v.Patch < other.Patch {
return -1
}
if v.Patch > other.Patch {
return 1
}
// 如果补丁版本号也相同,说明两个版本号相等
return 0
}
// 定义一个函数,将字符串形式的版本号转换为 Version 结构体
// 假设字符串形式的版本号符合 x.y.z 的格式,其中 x, y, z 为非负整数
// 如果转换失败,返回一个错误
func ParseVersion(s string) (*Version, error) {
s = strings.TrimSpace(s)
s = strings.TrimPrefix(s, "v")
s = strings.TrimPrefix(s, "V")
// 使用 . 作为分隔符,将字符串分割为三部分
parts := strings.Split(s, ".")
// 如果分割后的部分不是三个,说明格式不正确,返回一个错误
if len(parts) != 3 {
return nil, errors.New("invalid version format")
}
// 定义一个空的 Version 结构体
var v Version
// 使用 strconv.Atoi 函数,将字符串转换为整数
// 如果转换失败,返回一个错误
var err error
v.Major, err = strconv.Atoi(parts[0])
if err != nil {
return nil, err
}
v.Minor, err = strconv.Atoi(parts[1])
if err != nil {
return nil, err
}
v.Patch, err = strconv.Atoi(parts[2])
if err != nil {
return nil, err
}
// 返回转换后的 Version 结构体
return &v, nil
}