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 }