From 5c11b50c809cecadec9221d64f3f977b9ac88228 Mon Sep 17 00:00:00 2001 From: Yun Date: Sat, 13 Apr 2024 10:56:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 3 ++ versionx.go | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ versionx_test.go | 37 +++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 go.mod create mode 100644 versionx.go create mode 100644 versionx_test.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c1f958b --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module code.yun.ink/pkg/versionx + +go 1.20 diff --git a/versionx.go b/versionx.go new file mode 100644 index 0000000..e40c3fb --- /dev/null +++ b/versionx.go @@ -0,0 +1,76 @@ +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 +} diff --git a/versionx_test.go b/versionx_test.go new file mode 100644 index 0000000..3e6bf86 --- /dev/null +++ b/versionx_test.go @@ -0,0 +1,37 @@ +package versionx_test + +import ( + "fmt" + "testing" + + "code.yun.ink/pkg/versionx" +) + +// 定义一个测试函数,用于演示如何使用上面定义的函数和方法 +func TestVersionCompare(t *testing.T) { + // 定义两个字符串形式的版本号 + v1 := "v1.2.3" + v2 := "V1.3.0" + // 将字符串形式的版本号转换为 Version 结构体 + // 如果转换失败,打印错误并退出 + ver1, err := versionx.ParseVersion(v1) + if err != nil { + fmt.Println(err) + return + } + ver2, err := versionx.ParseVersion(v2) + if err != nil { + fmt.Println(err) + return + } + // 使用 Compare 方法,比较两个版本号的大小 + // 根据返回值,打印相应的结果 + switch ver1.Compare(*ver2) { + case -1: + fmt.Printf("%s < %s\n", v1, v2) + case 0: + fmt.Printf("%s = %s\n", v1, v2) + case 1: + fmt.Printf("%s > %s\n", v1, v2) + } +}