tools.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package utils
  2. import (
  3. "crypto/md5"
  4. crand "crypto/rand"
  5. "encoding/json"
  6. "fmt"
  7. "reflect"
  8. "runtime/debug"
  9. "strings"
  10. )
  11. func Md5(str string) string {
  12. t := md5.Sum(([]byte)(str))
  13. return fmt.Sprintf("%x", t)
  14. }
  15. func CopyStructByJson(src, dst interface{}) {
  16. str, _ := json.Marshal(src)
  17. err := json.Unmarshal(str, dst)
  18. if err != nil {
  19. return
  20. }
  21. }
  22. // CopyStructToMap 结构体转map
  23. func CopyStructToMap(src interface{}) map[string]interface{} {
  24. var res = map[string]interface{}{}
  25. str, _ := json.Marshal(src)
  26. err := json.Unmarshal(str, &res)
  27. if err != nil {
  28. return nil
  29. }
  30. return res
  31. }
  32. // SafeGo is a common function to recover panic for goroutines
  33. func SafeGo(f interface{}, params ...interface{}) {
  34. go func() {
  35. defer func() {
  36. if r := recover(); r != nil {
  37. fmt.Printf("Recovered in SafeGo: %v\n", r)
  38. debug.PrintStack()
  39. }
  40. }()
  41. // Convert f to a reflect.Value
  42. funcValue := reflect.ValueOf(f)
  43. // Check if the f is a function
  44. if funcValue.Kind() != reflect.Func {
  45. fmt.Println("SafeGo: value is not a function")
  46. return
  47. }
  48. // Convert params to reflect.Value
  49. paramsValue := make([]reflect.Value, len(params))
  50. for i, param := range params {
  51. paramsValue[i] = reflect.ValueOf(param)
  52. }
  53. // Call the function f with params
  54. funcValue.Call(paramsValue)
  55. }()
  56. }
  57. // RandomString 生成随机字符串
  58. func RandomString(n int) string {
  59. const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  60. length := len(letterBytes)
  61. b := make([]byte, n)
  62. randomBytes := make([]byte, n)
  63. if _, err := crand.Read(randomBytes); err != nil {
  64. return ""
  65. }
  66. for i, rb := range randomBytes {
  67. b[i] = letterBytes[int(rb)%length]
  68. }
  69. return string(b)
  70. }
  71. // Keys 泛型函数,K 是键类型,V 是值类型
  72. func Keys[K comparable, V any](m map[K]V) []K {
  73. keys := make([]K, 0, len(m))
  74. for k := range m {
  75. keys = append(keys, k)
  76. }
  77. return keys
  78. }
  79. // Values 泛型函数,K 是键类型,V 是值类型
  80. func Values[K comparable, V any](m map[K]V) []V {
  81. values := make([]V, 0, len(m))
  82. for _, v := range m {
  83. values = append(values, v)
  84. }
  85. return values
  86. }
  87. func InArray(k string, arr []string) bool {
  88. for _, v := range arr {
  89. if k == v {
  90. return true
  91. }
  92. }
  93. return false
  94. }
  95. func StringConcat(strs ...string) string {
  96. var builder strings.Builder
  97. for _, str := range strs {
  98. builder.WriteString(str)
  99. }
  100. return builder.String()
  101. }