object.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package domain
  2. import (
  3. "git.sxidc.com/go-framework/baize/logger"
  4. "git.sxidc.com/service-supports/fserr"
  5. "reflect"
  6. )
  7. type Object interface{}
  8. func SetField[T any](object Object, fieldName string, value T) {
  9. fieldValue, err := getObjectFieldValue(object, fieldName)
  10. if err != nil {
  11. logger.GetInstance().Error(err)
  12. return
  13. }
  14. if !fieldValue.IsValid() || !fieldValue.CanSet() {
  15. err := fserr.New("object字段" + fieldName + "无法赋值")
  16. logger.GetInstance().Error(err)
  17. return
  18. }
  19. fieldValue.Set(reflect.ValueOf(value))
  20. }
  21. func Field[T any](object Object, fieldName string) T {
  22. var zero T
  23. fieldValue, err := getObjectFieldValue(object, fieldName)
  24. if err != nil {
  25. logger.GetInstance().Error(err)
  26. return zero
  27. }
  28. if !fieldValue.IsValid() {
  29. err := fserr.New("object字段" + fieldName + "无法赋值")
  30. logger.GetInstance().Error(err)
  31. return zero
  32. }
  33. retValue, ok := fieldValue.Interface().(T)
  34. if !ok {
  35. err := fserr.New("object字段" + fieldName + "无法转换类型")
  36. logger.GetInstance().Error(err)
  37. return zero
  38. }
  39. return retValue
  40. }
  41. func ToConcreteObject[T Object](object Object) (T, error) {
  42. concrete, ok := object.(T)
  43. if !ok {
  44. var zero T
  45. return zero, fserr.New("领域对象转化失败")
  46. }
  47. return concrete, nil
  48. }
  49. func getObjectFieldValue(object Object, fieldName string) (*reflect.Value, error) {
  50. dtoType := reflect.TypeOf(object)
  51. if dtoType.Kind() != reflect.Ptr {
  52. return nil, fserr.New("object必须是结构指针类型")
  53. }
  54. if dtoType.Kind() == reflect.Ptr && dtoType.Elem().Kind() != reflect.Struct {
  55. return nil, fserr.New("object必须是结构指针类型")
  56. }
  57. dtoValue := reflect.ValueOf(object)
  58. if !dtoValue.IsValid() {
  59. return nil, fserr.New("object为nil")
  60. }
  61. fieldValue := dtoValue.Elem().FieldByName(fieldName)
  62. return &fieldValue, nil
  63. }