string.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package util
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "reflect"
  6. "strconv"
  7. "time"
  8. )
  9. //RandomStr 随机生成字符串
  10. func RandomStr(length int) string {
  11. str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  12. bytes := []byte(str)
  13. result := []byte{}
  14. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  15. for i := 0; i < length; i++ {
  16. result = append(result, bytes[r.Intn(len(bytes))])
  17. }
  18. return string(result)
  19. }
  20. // convert string to specify type
  21. type StrTo string
  22. func (f *StrTo) Set(v string) {
  23. if v != "" {
  24. *f = StrTo(v)
  25. } else {
  26. f.Clear()
  27. }
  28. }
  29. func (f *StrTo) Clear() {
  30. *f = StrTo(0x1E)
  31. }
  32. func (f StrTo) Exist() bool {
  33. return string(f) != string(0x1E)
  34. }
  35. func (f StrTo) Bool() (bool, error) {
  36. if f == "on" {
  37. return true, nil
  38. }
  39. return strconv.ParseBool(f.String())
  40. }
  41. func (f StrTo) Float32() (float32, error) {
  42. v, err := strconv.ParseFloat(f.String(), 32)
  43. return float32(v), err
  44. }
  45. func (f StrTo) Float64() (float64, error) {
  46. return strconv.ParseFloat(f.String(), 64)
  47. }
  48. func (f StrTo) Int() (int, error) {
  49. v, err := strconv.ParseInt(f.String(), 10, 32)
  50. return int(v), err
  51. }
  52. func (f StrTo) Int8() (int8, error) {
  53. v, err := strconv.ParseInt(f.String(), 10, 8)
  54. return int8(v), err
  55. }
  56. func (f StrTo) Int16() (int16, error) {
  57. v, err := strconv.ParseInt(f.String(), 10, 16)
  58. return int16(v), err
  59. }
  60. func (f StrTo) Int32() (int32, error) {
  61. v, err := strconv.ParseInt(f.String(), 10, 32)
  62. return int32(v), err
  63. }
  64. func (f StrTo) Int64() (int64, error) {
  65. v, err := strconv.ParseInt(f.String(), 10, 64)
  66. return int64(v), err
  67. }
  68. func (f StrTo) Uint() (uint, error) {
  69. v, err := strconv.ParseUint(f.String(), 10, 32)
  70. return uint(v), err
  71. }
  72. func (f StrTo) Uint8() (uint8, error) {
  73. v, err := strconv.ParseUint(f.String(), 10, 8)
  74. return uint8(v), err
  75. }
  76. func (f StrTo) Uint16() (uint16, error) {
  77. v, err := strconv.ParseUint(f.String(), 10, 16)
  78. return uint16(v), err
  79. }
  80. func (f StrTo) Uint32() (uint32, error) {
  81. v, err := strconv.ParseUint(f.String(), 10, 32)
  82. return uint32(v), err
  83. }
  84. func (f StrTo) Uint64() (uint64, error) {
  85. v, err := strconv.ParseUint(f.String(), 10, 64)
  86. return uint64(v), err
  87. }
  88. func (f StrTo) String() string {
  89. if f.Exist() {
  90. return string(f)
  91. }
  92. return ""
  93. }
  94. // convert any type to string
  95. func ToStr(value interface{}, args ...int) (s string) {
  96. switch v := value.(type) {
  97. case bool:
  98. s = strconv.FormatBool(v)
  99. case float32:
  100. s = strconv.FormatFloat(float64(v), 'f', argInt(args).Get(0, -1), argInt(args).Get(1, 32))
  101. case float64:
  102. s = strconv.FormatFloat(v, 'f', argInt(args).Get(0, -1), argInt(args).Get(1, 64))
  103. case int:
  104. s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10))
  105. case int8:
  106. s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10))
  107. case int16:
  108. s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10))
  109. case int32:
  110. s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10))
  111. case int64:
  112. s = strconv.FormatInt(v, argInt(args).Get(0, 10))
  113. case uint:
  114. s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10))
  115. case uint8:
  116. s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10))
  117. case uint16:
  118. s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10))
  119. case uint32:
  120. s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10))
  121. case uint64:
  122. s = strconv.FormatUint(v, argInt(args).Get(0, 10))
  123. case string:
  124. s = v
  125. case []byte:
  126. s = string(v)
  127. default:
  128. s = fmt.Sprintf("%v", v)
  129. }
  130. return s
  131. }
  132. // convert any numeric value to int64
  133. func ToInt64(value interface{}) (d int64, err error) {
  134. val := reflect.ValueOf(value)
  135. switch value.(type) {
  136. case int, int8, int16, int32, int64:
  137. d = val.Int()
  138. case uint, uint8, uint16, uint32, uint64:
  139. d = int64(val.Uint())
  140. default:
  141. err = fmt.Errorf("ToInt64 need numeric not `%T`", value)
  142. }
  143. return
  144. }
  145. type argString []string
  146. func (a argString) Get(i int, args ...string) (r string) {
  147. if i >= 0 && i < len(a) {
  148. r = a[i]
  149. } else if len(args) > 0 {
  150. r = args[0]
  151. }
  152. return
  153. }
  154. type argInt []int
  155. func (a argInt) Get(i int, args ...int) (r int) {
  156. if i >= 0 && i < len(a) {
  157. r = a[i]
  158. }
  159. if len(args) > 0 {
  160. r = args[0]
  161. }
  162. return
  163. }
  164. type argAny []interface{}
  165. func (a argAny) Get(i int, args ...interface{}) (r interface{}) {
  166. if i >= 0 && i < len(a) {
  167. r = a[i]
  168. }
  169. if len(args) > 0 {
  170. r = args[0]
  171. }
  172. return
  173. }