package utils import ( "errors" "fmt" "os" "path/filepath" "reflect" "runtime" "github.com/go-playground/validator" ) // Contains 判断字符串是否在切片中 func Contains(slice []string, target string) bool { for _, item := range slice { if item == target { return true } } return false } // 获取项目根目录 func GetProjectRoot() string { _, b, _, _ := runtime.Caller(0) projectRoot := filepath.Join(filepath.Dir(b), "../../") return projectRoot } // 获取可执行文件路径 func GetExePath() string { exePath, err := os.Executable() if err != nil { fmt.Println("获取可执行文件路径失败:", err) return "" } configPath := filepath.Dir(exePath) return configPath } // 校验参数 func ValidateStruct(data interface{}) error { validate := validator.New() rv := reflect.ValueOf(data) if rv.Kind() == reflect.Slice { for i := 0; i < rv.Len(); i++ { err := ValidateStruct(rv.Index(i).Interface()) if err != nil { return err } } } else { err := validate.Struct(data) if err != nil { for _, e := range err.(validator.ValidationErrors) { field, _ := reflect.TypeOf(data).FieldByName(e.Field()) fieldName := GetFieldName(field) return errors.New("缺少参数:" + fieldName) } } } return nil } // 获取字段名 func GetFieldName(field reflect.StructField) string { jsonTag := field.Tag.Get("json") if jsonTag != "" { return jsonTag } return field.Name } // GetJSONTag 根据字段的指针获取 JSON 标签 // func GetJSONTag(structType interface{}, fieldName string) string { // v := reflect.ValueOf(structType) // t := v.Type() // // 确保传入的是结构体 // if t.Kind() != reflect.Struct { // return "" // } // // 根据字段名查找字段 // field, ok := t.FieldByName(fieldName) // if !ok { // return "" // } // // 返回 JSON 标签 // return field.Tag.Get("json") // } // // GetJSONTag 获取指定字段的 JSON 标签 func GetJSONTag(structInstance interface{}, fieldValue interface{}) string { // 获取结构体的反射值 structVal := reflect.ValueOf(structInstance) structType := structVal.Type() // 确保传入的是结构体 if structType.Kind() != reflect.Struct { return "" } // 获取字段的反射值 fieldVal := reflect.ValueOf(fieldValue) // 确保字段值是结构体的字段 if fieldVal.Kind() == reflect.Ptr { fieldVal = fieldVal.Elem() // 获取指针指向的值 } // 遍历结构体字段 for i := 0; i < structType.NumField(); i++ { field := structType.Field(i) // 检查字段值是否匹配 if fieldVal.Interface() == structVal.Field(i).Interface() { return field.Tag.Get("json") } } return "" }