Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
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
|
|
}
|