fux comb298y
This commit is contained in:
@@ -1,19 +1,41 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// StructToMap 将结构体转换为 map[string]interface{}
|
||||
func StructToMap(data interface{}) (map[string]interface{}, error) {
|
||||
jsonData, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
result := make(map[string]interface{})
|
||||
|
||||
// 使用反射获取结构体的值
|
||||
v := reflect.ValueOf(data)
|
||||
if v.Kind() == reflect.Ptr {
|
||||
v = v.Elem()
|
||||
}
|
||||
if v.Kind() != reflect.Struct {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var result map[string]interface{}
|
||||
if err := json.Unmarshal(jsonData, &result); err != nil {
|
||||
return nil, err
|
||||
// 遍历结构体字段
|
||||
t := v.Type()
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
field := t.Field(i)
|
||||
value := v.Field(i)
|
||||
|
||||
// 获取字段名(优先使用 json tag)
|
||||
key := field.Name
|
||||
if jsonTag := field.Tag.Get("json"); jsonTag != "" && jsonTag != "-" {
|
||||
key = jsonTag
|
||||
}
|
||||
|
||||
// 处理字段值
|
||||
if value.IsValid() && !value.IsZero() {
|
||||
if value.Kind() == reflect.Ptr {
|
||||
value = value.Elem()
|
||||
}
|
||||
result[key] = value.Interface()
|
||||
}
|
||||
}
|
||||
|
||||
return result, nil
|
||||
|
||||
Reference in New Issue
Block a user