package system_dto import ( "reflect" "strconv" ) type Setting struct { InvokeAddress string `json:"invoke_address" key:"system.node.invoke_address"` } func MapStringToStruct[T any](m map[string]string) *T { var result T val := reflect.ValueOf(&result).Elem() // 获取结构体的类型 t := val.Type() // 查找结构体中与键名匹配的字段 for i := 0; i < t.NumField(); i++ { field := t.Field(i) key := field.Tag.Get("key") if key == "" { continue } v, ok := m[key] if !ok { continue } // 获取字段的值 fieldVal := val.Field(i) if !fieldVal.CanSet() { continue } fieldVal.SetString(v) // 如果字段不可设置,跳过 if !fieldVal.CanSet() { continue } // 根据字段的类型,进行类型转换 switch fieldVal.Kind() { case reflect.Float64: // 如果是 string 类型且非空,转换为 float64 if floatVal, err := strconv.ParseFloat(v, 64); err == nil { fieldVal.SetFloat(floatVal) } case reflect.Int: if intVal, err := strconv.Atoi(v); err == nil { fieldVal.SetInt(int64(intVal)) } case reflect.String: fieldVal.SetString(v) default: // 其他类型不进行转换 } } return &result }