tools.go 2.1 KB

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