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())
|
||
}
|
||
}
|