52 lines
1.6 KiB
Go
52 lines
1.6 KiB
Go
|
// Package utils -----------------------------
|
|||
|
// @file : requestDataToProto.go
|
|||
|
// @author : JJXu
|
|||
|
// @contact : wavingbear@163.com
|
|||
|
// @time : 2023/8/28 17:57
|
|||
|
// -------------------------------------------
|
|||
|
package utils
|
|||
|
|
|||
|
import (
|
|||
|
"reflect"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
// http请求转proto请求
|
|||
|
func RequestDataConvert(from interface{}, to interface{}) {
|
|||
|
var proxyField = "Query"
|
|||
|
fromValue := reflect.ValueOf(from)
|
|||
|
toValue := reflect.ValueOf(to)
|
|||
|
toType := reflect.TypeOf(to)
|
|||
|
|
|||
|
// 获取From结构体的字段信息
|
|||
|
fromType := fromValue.Type().Elem()
|
|||
|
for i := 0; i < fromType.NumField(); i++ {
|
|||
|
// 获取字段名和字段值
|
|||
|
fieldName := fromType.Field(i).Name
|
|||
|
fieldValue := fromValue.Elem().FieldByName(fieldName)
|
|||
|
if fieldName != proxyField {
|
|||
|
_, exists := toType.Elem().FieldByName(fieldName)
|
|||
|
if exists {
|
|||
|
// 设置To结构体中相应字段的值
|
|||
|
toValue.Elem().FieldByName(fieldName).Set(fieldValue)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
queryField, exists := toType.Elem().FieldByName(proxyField)
|
|||
|
if exists {
|
|||
|
var queryFieldTypeName string
|
|||
|
// 指针类型额外处理,拿到真实的数据类型
|
|||
|
if queryField.Type.Kind() == reflect.Ptr {
|
|||
|
queryFieldTypeName = queryField.Type.Elem().String()
|
|||
|
} else {
|
|||
|
queryFieldTypeName = queryField.Type.Kind().String()
|
|||
|
}
|
|||
|
//处理拿到的结构体类型如 utils.xxxx的类型,去掉utils.这部分
|
|||
|
if strings.Contains(queryFieldTypeName, ".") {
|
|||
|
queryFieldTypeName = strings.Split(queryFieldTypeName, ".")[1]
|
|||
|
}
|
|||
|
fromQueryValue := fromValue.Elem().FieldByName(queryFieldTypeName)
|
|||
|
toValue.Elem().FieldByName(proxyField).Set(fromQueryValue.Addr())
|
|||
|
}
|
|||
|
}
|