You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
3.9 KiB

4 years ago
  1. package utils
  2. import (
  3. "fmt"
  4. "io"
  5. "log"
  6. "mime/multipart"
  7. "os"
  8. "reflect"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. const (
  14. rolePrefix string = "role_"
  15. )
  16. // 将结构体内所有string类型字段去除首位空格
  17. // sp为结构体指针, s为结构体值
  18. func TrimStruct(sp interface{}, s interface{}) {
  19. // 判断类型是否为struct
  20. av := reflect.ValueOf(sp)
  21. avv := reflect.ValueOf(s)
  22. at := reflect.TypeOf(s)
  23. // 简单判断下
  24. if at.Kind() != reflect.Struct {
  25. log.Printf("s must be a struct")
  26. return
  27. }
  28. av = reflect.ValueOf(av.Interface())
  29. for i := 0; i < avv.NumField(); i++ {
  30. if at.Field(i).Type.Name() == "string" {
  31. f := av.Elem().Field(i)
  32. val := strings.TrimSpace(avv.Field(i).String())
  33. f.Set(reflect.ValueOf(val))
  34. }
  35. }
  36. return
  37. }
  38. //
  39. func FmtRolePrefix(sub interface{}) string {
  40. var s string
  41. switch sub.(type) {
  42. case int64:
  43. uid := sub.(int64)
  44. s = strconv.FormatInt(uid, 10)
  45. case string:
  46. s = sub.(string)
  47. }
  48. return fmt.Sprintf("%s%s", rolePrefix, s)
  49. }
  50. // timestamp to time
  51. func StampToTime(st int64) time.Time {
  52. return time.Unix(st / 1000, 0)
  53. }
  54. func IdsStrToIdsIntGroup(keys string) []int {
  55. IDS := make([]int, 0)
  56. ids := strings.Split(keys, ",")
  57. for i := 0; i < len(ids); i++ {
  58. ID:= ValueToInt(ids[i],0)
  59. IDS = append(IDS, ID)
  60. }
  61. return IDS
  62. }
  63. func IDsToStringIn(ids []int) string {
  64. ll := len(ids)
  65. var str string
  66. for i := 0; i < ll; i++ {
  67. if i > 0 {
  68. str = str + "," + ValueToString(ids[i], "")
  69. } else {
  70. str = ValueToString(ids[i], "")
  71. }
  72. }
  73. return str
  74. }
  75. func IDsToStrings(ids []string) string {
  76. ll := len(ids)
  77. var str string
  78. for i := 0; i < ll; i++ {
  79. if i > 0 {
  80. str = str + "','" + ValueToString(ids[i], "")
  81. } else {
  82. str = "'" + ValueToString(ids[i], "")
  83. }
  84. }
  85. if len(str) > 0 {
  86. str = str + "'"
  87. }
  88. return str
  89. }
  90. // SaveUploadedFile uploads the form file to specific dst.
  91. func SaveUploadedFile(file *multipart.FileHeader, dst string) error {
  92. src, err := file.Open()
  93. if err != nil {
  94. return err
  95. }
  96. defer src.Close()
  97. out, err := os.Create(dst)
  98. if err != nil {
  99. return err
  100. }
  101. defer out.Close()
  102. _, err = io.Copy(out, src)
  103. return err
  104. }
  105. func MakeOrderSn(key string) string {
  106. // 转大写
  107. key = strings.ToUpper(key)
  108. // 获取时间戳
  109. ts := time.Now().Format("20060102150405.000")
  110. tss := fmt.Sprint(time.Now().UnixNano())
  111. ts = string([]byte(ts)[0:14]) + string([]byte(tss)[13:16])
  112. return key + ts
  113. }
  114. //判断字符串是否在一个数组里
  115. func IsContain(items []string, item string) bool {
  116. for _, eachItem := range items {
  117. if eachItem == item {
  118. return true
  119. }
  120. }
  121. return false
  122. }
  123. // 是否是文件 不是文件也不一定是目录
  124. func IsFile(path string) bool {
  125. s, err := os.Stat(path)
  126. if err != nil {
  127. return false
  128. }
  129. return !s.IsDir()
  130. }
  131. //求并集
  132. func Union(slice1, slice2 []string) []string {
  133. m := make(map[string]int)
  134. for _, v := range slice1 {
  135. m[v]++
  136. }
  137. for _, v := range slice2 {
  138. times, _ := m[v]
  139. if times == 0 {
  140. slice1 = append(slice1, v)
  141. }
  142. }
  143. return slice1
  144. }
  145. //求交集
  146. func Intersect(slice1, slice2 []string) []string {
  147. m := make(map[string]int)
  148. nn := make([]string, 0)
  149. for _, v := range slice1 {
  150. m[v]++
  151. }
  152. for _, v := range slice2 {
  153. times, _ := m[v]
  154. if times == 1 {
  155. nn = append(nn, v)
  156. }
  157. }
  158. return nn
  159. }
  160. //求差集 slice1-并集
  161. func Difference(slice1, slice2 []string) []string {
  162. m := make(map[string]int)
  163. nn := make([]string, 0)
  164. inter := Intersect(slice1, slice2)
  165. for _, v := range inter {
  166. m[v]++
  167. }
  168. for _, value := range slice1 {
  169. times, _ := m[value]
  170. if times == 0 {
  171. nn = append(nn, value)
  172. }
  173. }
  174. return nn
  175. }
  176. // 将给定的整数值转换成给定长度的字符串,不足长度的在前面补足0
  177. func ConvInt2FormatString(input, ilen int)(retstring string){
  178. var igap int
  179. if len(string(input)) >= ilen {
  180. retstring = string(input)
  181. }else{
  182. igap = ilen - len(strconv.Itoa(input))
  183. retstring = strings.Repeat("0", igap) + strconv.Itoa(input)
  184. }
  185. return
  186. }