package common import ( "reflect" ) // StructToMap 将结构体转换为 map[string]interface{} func StructToMap(data interface{}) (map[string]interface{}, error) { 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 } // 遍历结构体字段 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 } func MapStructToAPIRequest(encryptedFields map[string]interface{}, fieldMapping map[string]string, wrapField string) map[string]interface{} { apiRequest := make(map[string]interface{}) // 遍历字段映射表 for structField, apiField := range fieldMapping { // 如果加密后的字段存在,才添加到请求 if value, exists := encryptedFields[structField]; exists { apiRequest[apiField] = value } } // 如果 wrapField 不为空,将 apiRequest 包裹到该字段下 if wrapField != "" { return map[string]interface{}{ wrapField: apiRequest, } } return apiRequest }