github.com/lingyao2333/mo-zero@v1.4.1/core/utils/version.go (about) 1 package utils 2 3 import ( 4 "strconv" 5 "strings" 6 7 "github.com/lingyao2333/mo-zero/core/mathx" 8 "github.com/lingyao2333/mo-zero/core/stringx" 9 ) 10 11 var replacer = stringx.NewReplacer(map[string]string{ 12 "V": "", 13 "v": "", 14 "-": ".", 15 }) 16 17 // CompareVersions returns true if the first field and the third field are equal, otherwise false. 18 func CompareVersions(v1, op, v2 string) bool { 19 result := compare(v1, v2) 20 switch op { 21 case "=", "==": 22 return result == 0 23 case "<": 24 return result == -1 25 case ">": 26 return result == 1 27 case "<=": 28 return result == -1 || result == 0 29 case ">=": 30 return result == 0 || result == 1 31 } 32 33 return false 34 } 35 36 // return -1 if v1<v2, 0 if they are equal, and 1 if v1>v2 37 func compare(v1, v2 string) int { 38 v1, v2 = replacer.Replace(v1), replacer.Replace(v2) 39 fields1, fields2 := strings.Split(v1, "."), strings.Split(v2, ".") 40 ver1, ver2 := strsToInts(fields1), strsToInts(fields2) 41 ver1len, ver2len := len(ver1), len(ver2) 42 shorter := mathx.MinInt(ver1len, ver2len) 43 44 for i := 0; i < shorter; i++ { 45 if ver1[i] == ver2[i] { 46 continue 47 } else if ver1[i] < ver2[i] { 48 return -1 49 } else { 50 return 1 51 } 52 } 53 54 if ver1len < ver2len { 55 return -1 56 } else if ver1len == ver2len { 57 return 0 58 } else { 59 return 1 60 } 61 } 62 63 func strsToInts(strs []string) []int64 { 64 if len(strs) == 0 { 65 return nil 66 } 67 68 ret := make([]int64, 0, len(strs)) 69 for _, str := range strs { 70 i, _ := strconv.ParseInt(str, 10, 64) 71 ret = append(ret, i) 72 } 73 74 return ret 75 }