fonchain-fiee/pkg/utils/requestDataToProto.go
2025-06-12 19:31:40 +08:00

52 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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