fonchain-fiee/pkg/utils/requestDataToProto.go

52 lines
1.6 KiB
Go
Raw Normal View History

2025-06-12 11:31:40 +00:00
// 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())
}
}