ver.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Author: NiuJiuRu
  2. // Email: niujiuru@qq.com
  3. package baseapp
  4. import (
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. )
  9. // 用32位无符号整数表示版本号, 组成格式:
  10. // [major(8bit)][minor(8bit)][patch(8bit)][build(8bit)]
  11. // 对应的字符串组成格式必须为: "x.y.z.w"
  12. type VersionCode uint32
  13. func NewVersionCode(major, minor, patch, build uint32) VersionCode {
  14. return VersionCode(major<<24 | minor<<16 | patch<<8 | build)
  15. }
  16. func (v *VersionCode) FromString(s string) error {
  17. parts := strings.Split(s, ".")
  18. if len(parts) != 4 {
  19. return fmt.Errorf("invalid version string: %s", s)
  20. }
  21. var u uint32
  22. for i, p := range parts {
  23. n, err := strconv.Atoi(p)
  24. if err != nil || n < 0 || n > 255 {
  25. return fmt.Errorf("invalid version part: %s", p)
  26. }
  27. u |= uint32(n) << uint((3-i)*8)
  28. }
  29. *v = VersionCode(u)
  30. return nil
  31. }
  32. func (v VersionCode) String() string {
  33. return fmt.Sprintf("%d.%d.%d.%d", v.Major(), v.Minor(), v.Patch(), v.Build())
  34. }
  35. func (v VersionCode) Parts() [4]uint32 {
  36. shifts := [4]uint{24, 16, 8, 0}
  37. var parts [4]uint32
  38. for i, s := range shifts {
  39. parts[i] = uint32(v>>s) & 0xFF
  40. }
  41. return parts
  42. }
  43. func (v VersionCode) Major() uint32 { return v.Parts()[0] }
  44. func (v VersionCode) Minor() uint32 { return v.Parts()[1] }
  45. func (v VersionCode) Patch() uint32 { return v.Parts()[2] }
  46. func (v VersionCode) Build() uint32 { return v.Parts()[3] }