// Package verx 版本号工具:点分版本号与结构互转、版本比较。 // VersionInfo 每段 2 字节(int64 存储,超出会溢出截断)。 package verx import ( "fmt" "strconv" "strings" "git.zeroonesoft.cn/golib/zogo/numx" ) // VersionInfo 版本号结构(每段 2 字节,与点分字符串互转) type VersionInfo struct { VersionMajor int64 `json:"versionMajor"` VersionMinor int64 `json:"versionMinor"` VersionPatch int64 `json:"versionPatch"` VersionBuild int64 `json:"versionBuild"` } // StringToVersionInfo 解析点分版本号字符串(如 1.2.3),每段最多 2 字节,超出会溢出截断 func StringToVersionInfo(str string) VersionInfo { ver := VersionInfo{0, 0, 0, 0} arr := strings.Split(str, ".") if len(arr) > 0 { ver.VersionMajor, _ = strconv.ParseInt(arr[0], 10, 64) } if len(arr) > 1 { ver.VersionMinor, _ = strconv.ParseInt(arr[1], 10, 64) } if len(arr) > 2 { ver.VersionPatch, _ = strconv.ParseInt(arr[2], 10, 64) } if len(arr) > 3 { ver.VersionBuild, _ = strconv.ParseInt(arr[3], 10, 64) } return ver } // VersionComparison 版本比较 1.大于 -1.小于 0.等于 func VersionComparison(ver1 VersionInfo, ver2 VersionInfo) int { if ver1.VersionMajor > ver2.VersionMajor { return 1 } else if ver1.VersionMajor < ver2.VersionMajor { return -1 } if ver1.VersionMinor > ver2.VersionMinor { return 1 } else if ver1.VersionMinor < ver2.VersionMinor { return -1 } if ver1.VersionPatch > ver2.VersionPatch { return 1 } else if ver1.VersionPatch < ver2.VersionPatch { return -1 } if ver1.VersionBuild > ver2.VersionBuild { return 1 } else if ver1.VersionBuild < ver2.VersionBuild { return -1 } return 0 } // VersionToString 将版本结构转为点分字符串 func VersionToString(ver VersionInfo) string { str := fmt.Sprintf("%d.%d.%d.%d", ver.VersionMajor, ver.VersionMinor, ver.VersionPatch, ver.VersionBuild) return str } // CompareVersion 比较两个版本号 version1 和 version2,如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。 func CompareVersion(version1 string, version2 string) int { var arr1 = strings.Split(version1, ".") var arr2 = strings.Split(version2, ".") var length1 = len(arr1) var length2 = len(arr2) var length = numx.Min(length1, length2) v1 := 0 v2 := 0 for i := 0; i < length; i++ { if i < length1 { v1, _ = strconv.Atoi(arr1[i]) } else { v1 = 0 } if i < length2 { v2, _ = strconv.Atoi(arr2[i]) } else { v2 = 0 } if v1 != v2 { if v1 > v2 { return 1 } else if v1 < v2 { return -1 } } } if v1 > v2 { return 1 } else if v1 < v2 { return -1 } return 0 }