init: 初始化项目

This commit is contained in:
0264408
2026-03-10 16:26:48 +08:00
commit 57e0ef2cf6
79 changed files with 8943 additions and 0 deletions

110
pkg/util/version.go Normal file
View File

@@ -0,0 +1,110 @@
package util
import (
"strconv"
"strings"
)
// CompareVersion 比较两个语义化版本号
// 返回值1 表示 v1 > v2-1 表示 v1 < v20 表示 v1 == v2
// 支持格式1.0.0, v1.0.0, 1.0.0-beta.1, 1.0.0+build.123
func CompareVersion(v1, v2 string) int {
// 移除 v 前缀
v1 = strings.TrimPrefix(v1, "v")
v2 = strings.TrimPrefix(v2, "v")
// 分离主版本号和预发布/构建元数据
v1Main, v1Pre := splitVersion(v1)
v2Main, v2Pre := splitVersion(v2)
// 比较主版本号
result := compareMainVersion(v1Main, v2Main)
if result != 0 {
return result
}
// 主版本号相同,比较预发布版本
return comparePreRelease(v1Pre, v2Pre)
}
// splitVersion 分离主版本号和预发布标识
func splitVersion(version string) (main, preRelease string) {
// 移除构建元数据 (+build.xxx)
if idx := strings.Index(version, "+"); idx != -1 {
version = version[:idx]
}
// 分离预发布标识 (-beta.1)
if idx := strings.Index(version, "-"); idx != -1 {
return version[:idx], version[idx+1:]
}
return version, ""
}
// compareMainVersion 比较主版本号 (major.minor.patch)
func compareMainVersion(v1, v2 string) int {
parts1 := strings.Split(v1, ".")
parts2 := strings.Split(v2, ".")
// 补齐到相同长度
maxLen := len(parts1)
if len(parts2) > maxLen {
maxLen = len(parts2)
}
for i := 0; i < maxLen; i++ {
var num1, num2 int
if i < len(parts1) {
num1, _ = strconv.Atoi(parts1[i])
}
if i < len(parts2) {
num2, _ = strconv.Atoi(parts2[i])
}
if num1 > num2 {
return 1
}
if num1 < num2 {
return -1
}
}
return 0
}
// comparePreRelease 比较预发布版本
// 没有预发布标识的版本 > 有预发布标识的版本
// 例如1.0.0 > 1.0.0-beta
func comparePreRelease(pre1, pre2 string) int {
// 都没有预发布标识,相等
if pre1 == "" && pre2 == "" {
return 0
}
// v1 是正式版v2 是预发布版
if pre1 == "" && pre2 != "" {
return 1
}
// v1 是预发布版v2 是正式版
if pre1 != "" && pre2 == "" {
return -1
}
// 都是预发布版,按字典序比较
if pre1 < pre2 {
return -1
}
if pre1 > pre2 {
return 1
}
return 0
}
// IsNewerVersion 检查 newVer 是否比 currentVer 新
func IsNewerVersion(currentVer, newVer string) bool {
return CompareVersion(newVer, currentVer) > 0
}