@@ -0,0 +1,99 @@
|
||||
package version
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Version struct {
|
||||
Major int
|
||||
Minor int
|
||||
Revision int
|
||||
}
|
||||
|
||||
var ErrVersionString = errors.New("bad version string")
|
||||
|
||||
func New(ver string) (*Version, error) {
|
||||
vs := strings.Split(ver, ".")
|
||||
if len(vs) != 3 {
|
||||
return nil, ErrVersionString
|
||||
}
|
||||
major, err := strconv.Atoi(vs[0])
|
||||
if err != nil {
|
||||
return nil, ErrVersionString
|
||||
}
|
||||
minor, err := strconv.Atoi(vs[1])
|
||||
if err != nil || minor > 999 {
|
||||
return nil, ErrVersionString
|
||||
}
|
||||
revision, err := strconv.Atoi(vs[2])
|
||||
if err != nil || revision > 999 {
|
||||
return nil, ErrVersionString
|
||||
}
|
||||
return &Version{Major: major, Minor: minor, Revision: revision}, nil
|
||||
}
|
||||
|
||||
func MustNew(ver string) *Version {
|
||||
v, err := New(ver)
|
||||
if err != nil {
|
||||
panic("bad version")
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (v *Version) GetCode() int64 {
|
||||
return int64(v.Major*1000000) + int64(v.Minor*1000) + int64(v.Revision)
|
||||
}
|
||||
|
||||
// for print
|
||||
func (v *Version) String() string {
|
||||
return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Revision)
|
||||
}
|
||||
|
||||
// Compare 0相等, -1是 v< other, 1 v > other
|
||||
func (v *Version) Compare(other *Version) float64 {
|
||||
if v.String() == other.String() {
|
||||
return 0
|
||||
}
|
||||
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.Revision > other.Revision {
|
||||
return 1
|
||||
}
|
||||
if v.Revision < other.Revision {
|
||||
return -1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (v *Version) GT(other *Version) bool {
|
||||
return v.Compare(other) > 0
|
||||
}
|
||||
|
||||
func (v *Version) LT(other *Version) bool {
|
||||
return v.Compare(other) < 0
|
||||
}
|
||||
|
||||
func (v *Version) EQ(other *Version) bool {
|
||||
return v.Compare(other) == 0
|
||||
}
|
||||
|
||||
func (v *Version) GTE(other *Version) bool {
|
||||
return v.Compare(other) >= 0
|
||||
}
|
||||
|
||||
func (v *Version) LTE(other *Version) bool {
|
||||
return v.Compare(other) <= 0
|
||||
}
|
||||
Reference in New Issue
Block a user