劲创营---任务项目
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

207 satır
4.7 KiB

  1. package utils
  2. import (
  3. "fmt"
  4. "github.com/syyongx/php2go"
  5. "math/rand"
  6. "reflect"
  7. "sort"
  8. "strings"
  9. "time"
  10. )
  11. func Implode(glue string, args ...interface{}) string {
  12. data := make([]string, len(args))
  13. for i, s := range args {
  14. data[i] = fmt.Sprint(s)
  15. }
  16. return strings.Join(data, glue)
  17. }
  18. func CreateCaptcha() string {
  19. return fmt.Sprintf("%05v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))
  20. }
  21. // 字符串是否在数组里
  22. func InArr(target string, str_array []string) bool {
  23. for _, element := range str_array {
  24. if target == element {
  25. return true
  26. }
  27. }
  28. return false
  29. }
  30. func InArrToInt(target int, str_array []int) bool {
  31. for _, element := range str_array {
  32. if target == element {
  33. return true
  34. }
  35. }
  36. return false
  37. }
  38. // 把数组的值放到key里
  39. func ArrayColumn(array interface{}, key string) (result map[string]interface{}, err error) {
  40. result = make(map[string]interface{})
  41. t := reflect.TypeOf(array)
  42. v := reflect.ValueOf(array)
  43. if t.Kind() != reflect.Slice {
  44. return nil, nil
  45. }
  46. if v.Len() == 0 {
  47. return nil, nil
  48. }
  49. for i := 0; i < v.Len(); i++ {
  50. indexv := v.Index(i)
  51. if indexv.Type().Kind() != reflect.Struct {
  52. return nil, nil
  53. }
  54. mapKeyInterface := indexv.FieldByName(key)
  55. if mapKeyInterface.Kind() == reflect.Invalid {
  56. return nil, nil
  57. }
  58. mapKeyString, err := InterfaceToString(mapKeyInterface.Interface())
  59. if err != nil {
  60. return nil, err
  61. }
  62. result[mapKeyString] = indexv.Interface()
  63. }
  64. return result, err
  65. }
  66. // 转string
  67. func InterfaceToString(v interface{}) (result string, err error) {
  68. switch reflect.TypeOf(v).Kind() {
  69. case reflect.Int64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32:
  70. result = fmt.Sprintf("%v", v)
  71. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  72. result = fmt.Sprintf("%v", v)
  73. case reflect.String:
  74. result = v.(string)
  75. default:
  76. err = nil
  77. }
  78. return result, err
  79. }
  80. func HideTrueName(name string) string {
  81. res := "**"
  82. if name != "" {
  83. runs := []rune(name)
  84. leng := len(runs)
  85. if leng <= 3 {
  86. res = string(runs[0:1]) + res
  87. } else if leng < 5 {
  88. res = string(runs[0:2]) + res
  89. } else if leng < 10 {
  90. res = string(runs[0:2]) + "***" + string(runs[leng-2:leng])
  91. } else if leng < 16 {
  92. res = string(runs[0:3]) + "****" + string(runs[leng-3:leng])
  93. } else {
  94. res = string(runs[0:4]) + "*****" + string(runs[leng-4:leng])
  95. }
  96. }
  97. return res
  98. }
  99. func GetQueryParam(uri string) map[string]string {
  100. //根据问号分割路由还是query参数
  101. uriList := strings.Split(uri, "?")
  102. var query = make(map[string]string, 0)
  103. //有参数才处理
  104. if len(uriList) == 2 {
  105. //分割query参数
  106. var queryList = strings.Split(uriList[1], "&")
  107. if len(queryList) > 0 {
  108. //key value 分别赋值
  109. for _, v := range queryList {
  110. var valueList = strings.Split(v, "=")
  111. if len(valueList) == 2 {
  112. value, _ := php2go.URLDecode(valueList[1])
  113. if value == "" {
  114. value = valueList[1]
  115. }
  116. query[valueList[0]] = value
  117. }
  118. }
  119. }
  120. }
  121. return query
  122. }
  123. // JoinStringsInASCII 按照规则,参数名ASCII码从小到大排序后拼接
  124. // data 待拼接的数据
  125. // sep 连接符
  126. // onlyValues 是否只包含参数值,true则不包含参数名,否则参数名和参数值均有
  127. // includeEmpty 是否包含空值,true则包含空值,否则不包含,注意此参数不影响参数名的存在
  128. // exceptKeys 被排除的参数名,不参与排序及拼接
  129. func JoinStringsInASCII(data map[string]string, sep string, onlyValues, includeEmpty bool, exceptKeys ...string) string {
  130. var list []string
  131. var keyList []string
  132. m := make(map[string]int)
  133. if len(exceptKeys) > 0 {
  134. for _, except := range exceptKeys {
  135. m[except] = 1
  136. }
  137. }
  138. for k := range data {
  139. if _, ok := m[k]; ok {
  140. continue
  141. }
  142. value := data[k]
  143. if !includeEmpty && value == "" {
  144. continue
  145. }
  146. if onlyValues {
  147. keyList = append(keyList, k)
  148. } else {
  149. list = append(list, fmt.Sprintf("%s=%s", k, value))
  150. }
  151. }
  152. if onlyValues {
  153. sort.Strings(keyList)
  154. for _, v := range keyList {
  155. list = append(list, AnyToString(data[v]))
  156. }
  157. } else {
  158. sort.Strings(list)
  159. }
  160. return strings.Join(list, sep)
  161. }
  162. // x的y次方
  163. func RandPow(l int) string {
  164. var i = "1"
  165. for j := 0; j < l; j++ {
  166. i += "0"
  167. }
  168. k := StrToInt64(i)
  169. n := rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(k)
  170. ls := "%0" + IntToStr(l) + "v"
  171. str := fmt.Sprintf(ls, n)
  172. //min := int(math.Pow10(l - 1))
  173. //max := int(math.Pow10(l) - 1)
  174. return str
  175. }
  176. // 根据显示长度截取字符串
  177. func ShowSubstr(s string, l int) string {
  178. if len(s) <= l {
  179. return s
  180. }
  181. ss, sl, rl, rs := "", 0, 0, []rune(s)
  182. for _, r := range rs {
  183. rint := int(r)
  184. if rint < 128 {
  185. rl = 1
  186. } else {
  187. rl = 2
  188. }
  189. if sl+rl > l {
  190. break
  191. }
  192. sl += rl
  193. ss += string(r)
  194. }
  195. return ss
  196. }