tools.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package main
  2. import (
  3. "hash/fnv"
  4. "strconv"
  5. "time"
  6. )
  7. func hashCompanyID(companyID string) uint32 {
  8. h := fnv.New32a()
  9. h.Write([]byte(companyID))
  10. return h.Sum32()
  11. }
  12. // parseDate 尝试解析时间字符串,支持 "2006-01-02 15:04:05" 和 "2006-01-02"
  13. func parseDate(v interface{}) *time.Time {
  14. if str, ok := v.(string); ok && str != "" {
  15. t, err := time.Parse("2006-01-02 15:04:05", str)
  16. if err == nil {
  17. return &t
  18. }
  19. t, err = time.Parse("2006-01-02", str)
  20. if err == nil {
  21. return &t
  22. }
  23. }
  24. return nil
  25. }
  26. // strVal 返回字符串值,类型不是字符串或为空时返回空字符串
  27. func strVal(v interface{}) string {
  28. if s, ok := v.(string); ok {
  29. return s
  30. }
  31. return ""
  32. }
  33. func strPtr(v interface{}) *string {
  34. if s, ok := v.(string); ok && s != "" {
  35. return &s
  36. }
  37. return nil
  38. }
  39. // fallbackNow 如果时间指针非空,返回其值,否则返回当前时间
  40. func fallbackNow(t *time.Time) time.Time {
  41. if t != nil {
  42. return *t
  43. }
  44. return time.Now()
  45. }
  46. func parseInt16(v interface{}) int16 {
  47. switch t := v.(type) {
  48. case int32:
  49. return int16(t)
  50. case int:
  51. return int16(t)
  52. case float64:
  53. return int16(t)
  54. case int64:
  55. return int16(t)
  56. case string:
  57. if i, err := strconv.Atoi(t); err == nil {
  58. return int16(i)
  59. }
  60. }
  61. return 0
  62. }
  63. func getInt8Ptr(v interface{}) *int8 {
  64. if v == nil {
  65. return nil
  66. }
  67. switch val := v.(type) {
  68. case int8:
  69. return &val
  70. case int:
  71. tmp := int8(val)
  72. return &tmp
  73. case int32:
  74. tmp := int8(val)
  75. return &tmp
  76. case int64:
  77. tmp := int8(val)
  78. return &tmp
  79. case float64:
  80. tmp := int8(val)
  81. return &tmp
  82. case string:
  83. if i, err := strconv.Atoi(val); err == nil {
  84. tmp := int8(i)
  85. return &tmp
  86. }
  87. }
  88. return nil
  89. }
  90. // getInt8 将多种类型转换为 int8,无法转换时返回 0
  91. func getInt8(v interface{}) int8 {
  92. switch t := v.(type) {
  93. case int:
  94. return int8(t)
  95. case int32:
  96. return int8(t)
  97. case int64:
  98. return int8(t)
  99. case float64:
  100. return int8(t)
  101. case string:
  102. if i, err := strconv.Atoi(t); err == nil {
  103. return int8(i)
  104. }
  105. }
  106. return 0
  107. }
  108. func int16Val(v interface{}) int16 {
  109. if v == nil {
  110. return 0
  111. }
  112. switch val := v.(type) {
  113. case int:
  114. return int16(val)
  115. case int64:
  116. return int16(val)
  117. case float64:
  118. return int16(val)
  119. case string:
  120. if i, err := strconv.Atoi(val); err == nil {
  121. return int16(i)
  122. }
  123. }
  124. return 0
  125. }
  126. func getIntPtr(v interface{}) *int {
  127. switch val := v.(type) {
  128. case int:
  129. return &val
  130. case int8:
  131. x := int(val)
  132. return &x
  133. case int16:
  134. x := int(val)
  135. return &x
  136. case int32:
  137. x := int(val)
  138. return &x
  139. case int64:
  140. x := int(val)
  141. return &x
  142. case float32:
  143. x := int(val)
  144. return &x
  145. case float64:
  146. x := int(val)
  147. return &x
  148. case string:
  149. if i, err := strconv.Atoi(val); err == nil {
  150. return &i
  151. }
  152. }
  153. return nil
  154. }
  155. func intVal(v interface{}) int {
  156. switch val := v.(type) {
  157. case int:
  158. return val
  159. case int8:
  160. return int(val)
  161. case int16:
  162. return int(val)
  163. case int32:
  164. return int(val)
  165. case int64:
  166. return int(val)
  167. case uint:
  168. return int(val)
  169. case uint8:
  170. return int(val)
  171. case uint16:
  172. return int(val)
  173. case uint32:
  174. return int(val)
  175. case uint64:
  176. return int(val)
  177. case float32:
  178. return int(val)
  179. case float64:
  180. return int(val)
  181. case string:
  182. if i, err := strconv.Atoi(val); err == nil {
  183. return i
  184. }
  185. case []byte:
  186. if i, err := strconv.Atoi(string(val)); err == nil {
  187. return i
  188. }
  189. case nil:
  190. return 0
  191. }
  192. return 0
  193. }