12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- package assign
- import (
- "git.sxidc.com/go-tools/utils/reflectutils"
- "github.com/pkg/errors"
- "reflect"
- )
- type OnParsedFieldTagCallback func(fromFieldName string, fromFieldElemValue reflect.Value, toFieldElementValue reflect.Value, tag *Tag) error
- func UseTag(from any, to any, onParsedFieldTagFunc OnParsedFieldTagCallback) error {
- if from == nil || to == nil {
- return nil
- }
- fromValue := reflect.ValueOf(from)
- toValue := reflect.ValueOf(to)
- // 类型校验
- if !reflectutils.IsValueStructOrStructPointer(fromValue) {
- return errors.New("参数不是结构或结构指针")
- }
- if !reflectutils.IsValueStructPointer(toValue) {
- return errors.New("返回类型不是结构指针")
- }
- fromElemValue := reflectutils.PointerValueElem(fromValue)
- toElemValue := reflectutils.PointerValueElem(toValue)
- for i := 0; i < toElemValue.NumField(); i++ {
- toField := toElemValue.Field(i)
- if !toField.IsValid() {
- return errors.New("被赋值的结构存在无效字段")
- }
- // 初始化空值指针
- if toField.Kind() == reflect.Ptr && toField.IsNil() {
- toField.Set(reflect.New(toField.Type().Elem()))
- }
- }
- err := parseTag(fromElemValue, &toElemValue, onParsedFieldTagFunc)
- if err != nil {
- return err
- }
- return nil
- }
|