utils.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package utils
  2. import (
  3. "errors"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "reflect"
  8. "runtime"
  9. "github.com/go-playground/validator"
  10. )
  11. // Contains 判断字符串是否在切片中
  12. func Contains(slice []string, target string) bool {
  13. for _, item := range slice {
  14. if item == target {
  15. return true
  16. }
  17. }
  18. return false
  19. }
  20. // 获取项目根目录
  21. func GetProjectRoot() string {
  22. _, b, _, _ := runtime.Caller(0)
  23. projectRoot := filepath.Join(filepath.Dir(b), "../../")
  24. return projectRoot
  25. }
  26. // 获取可执行文件路径
  27. func GetExePath() string {
  28. exePath, err := os.Executable()
  29. if err != nil {
  30. fmt.Println("获取可执行文件路径失败:", err)
  31. return ""
  32. }
  33. configPath := filepath.Dir(exePath)
  34. return configPath
  35. }
  36. // 校验参数
  37. func ValidateStruct(data interface{}) error {
  38. validate := validator.New()
  39. rv := reflect.ValueOf(data)
  40. if rv.Kind() == reflect.Slice {
  41. for i := 0; i < rv.Len(); i++ {
  42. err := ValidateStruct(rv.Index(i).Interface())
  43. if err != nil {
  44. return err
  45. }
  46. }
  47. } else {
  48. err := validate.Struct(data)
  49. if err != nil {
  50. for _, e := range err.(validator.ValidationErrors) {
  51. field, _ := reflect.TypeOf(data).FieldByName(e.Field())
  52. fieldName := GetFieldName(field)
  53. return errors.New("缺少参数:" + fieldName)
  54. }
  55. }
  56. }
  57. return nil
  58. }
  59. // 获取字段名
  60. func GetFieldName(field reflect.StructField) string {
  61. jsonTag := field.Tag.Get("json")
  62. if jsonTag != "" {
  63. return jsonTag
  64. }
  65. return field.Name
  66. }
  67. // GetJSONTag 根据字段的指针获取 JSON 标签
  68. // func GetJSONTag(structType interface{}, fieldName string) string {
  69. // v := reflect.ValueOf(structType)
  70. // t := v.Type()
  71. // // 确保传入的是结构体
  72. // if t.Kind() != reflect.Struct {
  73. // return ""
  74. // }
  75. // // 根据字段名查找字段
  76. // field, ok := t.FieldByName(fieldName)
  77. // if !ok {
  78. // return ""
  79. // }
  80. // // 返回 JSON 标签
  81. // return field.Tag.Get("json")
  82. // }
  83. //
  84. // GetJSONTag 获取指定字段的 JSON 标签
  85. func GetJSONTag(structInstance interface{}, fieldValue interface{}) string {
  86. // 获取结构体的反射值
  87. structVal := reflect.ValueOf(structInstance)
  88. structType := structVal.Type()
  89. // 确保传入的是结构体
  90. if structType.Kind() != reflect.Struct {
  91. return ""
  92. }
  93. // 获取字段的反射值
  94. fieldVal := reflect.ValueOf(fieldValue)
  95. // 确保字段值是结构体的字段
  96. if fieldVal.Kind() == reflect.Ptr {
  97. fieldVal = fieldVal.Elem() // 获取指针指向的值
  98. }
  99. // 遍历结构体字段
  100. for i := 0; i < structType.NumField(); i++ {
  101. field := structType.Field(i)
  102. // 检查字段值是否匹配
  103. if fieldVal.Interface() == structVal.Field(i).Interface() {
  104. return field.Tag.Get("json")
  105. }
  106. }
  107. return ""
  108. }