package utils import ( "fmt" "github.com/mitchellh/mapstructure" "reflect" ) func Struct2Map(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v := reflect.ValueOf(obj) if t.Kind() == reflect.Ptr { t = t.Elem() v = reflect.Indirect(v) } var data = make(map[string]interface{}) //func (v Value) NumField() int, 返回v持有的结构体类型值的字段数,如果v的Kind不是Struct会panic for i := 0; i < t.NumField(); i++ { n := t.Field(i).Name vv := v.Field(i).Interface() data[Capitalize(n)] = vv } return data } func Map2Struct(obj interface{}, mapInfo map[string]interface{}) interface{} { err := mapstructure.Decode(mapInfo, obj) if err != nil { fmt.Println(err) } return obj } // Capitalize 字符首字母大写 func Capitalize(str string) string { var upperStr string vv := []rune(str) // 后文有介绍 for i := 0; i < len(vv); i++ { if i == 0 { if vv[i] >= 65 && vv[i] <= 96 { // 后文有介绍 vv[i] += 32 // string的码表相差32位 upperStr += string(vv[i]) } else { fmt.Println("Not begins with uppercase letter,") return str } } else { upperStr += string(vv[i]) } } return upperStr }