assign.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package assign
  2. import (
  3. "git.sxidc.com/go-tools/utils/reflectutils"
  4. "github.com/pkg/errors"
  5. "reflect"
  6. )
  7. type OnParsedFieldTagCallback func(fromFieldName string, fromFieldElemValue reflect.Value, toFieldElementValue reflect.Value, tag *Tag) error
  8. func UseTag(from any, to any, onParsedFieldTagFunc OnParsedFieldTagCallback) error {
  9. if from == nil || to == nil {
  10. return nil
  11. }
  12. fromValue := reflect.ValueOf(from)
  13. toValue := reflect.ValueOf(to)
  14. // 类型校验
  15. if !reflectutils.IsValueStructOrStructPointer(fromValue) {
  16. return errors.New("参数不是结构或结构指针")
  17. }
  18. if !reflectutils.IsValueStructPointer(toValue) {
  19. return errors.New("返回类型不是结构指针")
  20. }
  21. fromElemValue := reflectutils.PointerValueElem(fromValue)
  22. toElemValue := reflectutils.PointerValueElem(toValue)
  23. for i := 0; i < toElemValue.NumField(); i++ {
  24. toField := toElemValue.Field(i)
  25. if !toField.IsValid() {
  26. return errors.New("被赋值的结构存在无效字段")
  27. }
  28. // 初始化空值指针
  29. if toField.Kind() == reflect.Ptr && toField.IsNil() {
  30. toField.Set(reflect.New(toField.Type().Elem()))
  31. }
  32. }
  33. err := parseTag(fromElemValue, &toElemValue, onParsedFieldTagFunc)
  34. if err != nil {
  35. return err
  36. }
  37. return nil
  38. }