github.com/gogf/gf@v1.16.9/text/gstr/gstr_version.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/gogf/gf. 6 7 package gstr 8 9 import ( 10 "github.com/gogf/gf/util/gconv" 11 "strings" 12 ) 13 14 // CompareVersion compares <a> and <b> as standard GNU version. 15 // It returns 1 if <a> > <b>. 16 // It returns -1 if <a> < <b>. 17 // It returns 0 if <a> = <b>. 18 // GNU standard version is like: 19 // v1.0 20 // 1 21 // 1.0.0 22 // v1.0.1 23 // v2.10.8 24 // 10.2.0 25 // etc. 26 func CompareVersion(a, b string) int { 27 if a != "" && a[0] == 'v' { 28 a = a[1:] 29 } 30 if b != "" && b[0] == 'v' { 31 b = b[1:] 32 } 33 var ( 34 array1 = strings.Split(a, ".") 35 array2 = strings.Split(b, ".") 36 diff = 0 37 ) 38 diff = len(array2) - len(array1) 39 for i := 0; i < diff; i++ { 40 array1 = append(array1, "0") 41 } 42 diff = len(array1) - len(array2) 43 for i := 0; i < diff; i++ { 44 array2 = append(array2, "0") 45 } 46 v1 := 0 47 v2 := 0 48 for i := 0; i < len(array1); i++ { 49 v1 = gconv.Int(array1[i]) 50 v2 = gconv.Int(array2[i]) 51 if v1 > v2 { 52 return 1 53 } 54 if v1 < v2 { 55 return -1 56 } 57 } 58 return 0 59 } 60 61 // CompareVersionGo compares <a> and <b> as standard Golang version. 62 // It returns 1 if <a> > <b>. 63 // It returns -1 if <a> < <b>. 64 // It returns 0 if <a> = <b>. 65 // Golang standard version is like: 66 // 1.0.0 67 // v1.0.1 68 // v2.10.8 69 // 10.2.0 70 // v0.0.0-20190626092158-b2ccc519800e 71 // v4.20.0+incompatible 72 // etc. 73 func CompareVersionGo(a, b string) int { 74 if a != "" && a[0] == 'v' { 75 a = a[1:] 76 } 77 if b != "" && b[0] == 'v' { 78 b = b[1:] 79 } 80 if Count(a, "-") > 1 { 81 if i := PosR(a, "-"); i > 0 { 82 a = a[:i] 83 } 84 } 85 if Count(b, "-") > 1 { 86 if i := PosR(b, "-"); i > 0 { 87 b = b[:i] 88 } 89 } 90 if i := Pos(a, "+"); i > 0 { 91 a = a[:i] 92 } 93 if i := Pos(b, "+"); i > 0 { 94 b = b[:i] 95 } 96 a = Replace(a, "-", ".") 97 b = Replace(b, "-", ".") 98 var ( 99 array1 = strings.Split(a, ".") 100 array2 = strings.Split(b, ".") 101 diff = 0 102 ) 103 // Specially in Golang: 104 // "v1.12.2-0.20200413154443-b17e3a6804fa" < "v1.12.2" 105 if len(array1) > 3 && len(array2) <= 3 { 106 return -1 107 } 108 if len(array1) <= 3 && len(array2) > 3 { 109 return 1 110 } 111 diff = len(array2) - len(array1) 112 for i := 0; i < diff; i++ { 113 array1 = append(array1, "0") 114 } 115 diff = len(array1) - len(array2) 116 for i := 0; i < diff; i++ { 117 array2 = append(array2, "0") 118 } 119 v1 := 0 120 v2 := 0 121 for i := 0; i < len(array1); i++ { 122 v1 = gconv.Int(array1[i]) 123 v2 = gconv.Int(array2[i]) 124 if v1 > v2 { 125 return 1 126 } 127 if v1 < v2 { 128 return -1 129 } 130 } 131 return 0 132 }