123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- 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 ""
- }
|