| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package format
- import (
- "fmt"
- "reflect"
- "strconv"
- "strings"
- )
- // 解析gorm标签,返回键值对
- func ParseGormTag(tag string) map[string]string {
- result := make(map[string]string)
- pairs := strings.Split(tag, ";")
- for _, pair := range pairs {
- kv := strings.Split(pair, ":")
- if len(kv) == 2 {
- result[kv[0]] = kv[1]
- } else {
- result[kv[0]] = ""
- }
- }
- return result
- }
- // 将map的值赋给struct
- func MapToStruct(input map[string]interface{}, output interface{}) error {
- outputValue := reflect.ValueOf(output).Elem()
- outputType := outputValue.Type()
- for i := 0; i < outputType.NumField(); i++ {
- field := outputType.Field(i)
- column := field.Tag.Get("gorm")
- if column == "" {
- continue
- }
- tags := ParseGormTag(column)
- columnName := tags["column"]
- if value, ok := input[columnName]; ok {
- fieldValue := outputValue.FieldByName(field.Name)
- if fieldValue.CanSet() {
- val := reflect.ValueOf(value)
- if val.Type().ConvertibleTo(fieldValue.Type()) {
- fieldValue.Set(val.Convert(fieldValue.Type()))
- } else {
- // 特别处理常见的类型转换
- switch fieldValue.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- if intValue, err := strconv.Atoi(fmt.Sprintf("%v", value)); err == nil {
- fieldValue.SetInt(int64(intValue))
- }
- case reflect.String:
- fieldValue.SetString(fmt.Sprintf("%v", value))
- case reflect.Float32, reflect.Float64:
- if floatValue, err := strconv.ParseFloat(fmt.Sprintf("%v", value), 64); err == nil {
- fieldValue.SetFloat(floatValue)
- }
- }
- }
- }
- }
- }
- return nil
- }
- func ConvertNilToEmptyString(data interface{}) interface{} {
- switch v := data.(type) {
- case nil:
- return ""
- case map[string]interface{}:
- for key, val := range v {
- v[key] = ConvertNilToEmptyString(val)
- }
- case []interface{}:
- for i, val := range v {
- v[i] = ConvertNilToEmptyString(val)
- }
- }
- //去除字符串左边和右边的空格
- if reflect.TypeOf(data).Kind() == reflect.String {
- data = strings.TrimLeft(data.(string), " ")
- data = strings.TrimRight(data.(string), " ")
- }
- return data
- }
|