object.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package domain
  2. import (
  3. "git.sxidc.com/go-framework/baize/infrastructure/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 {
  42. concrete, ok := object.(T)
  43. if !ok {
  44. logger.GetInstance().Error(fserr.New("领域对象转化失败"))
  45. var zero T
  46. return zero
  47. }
  48. return concrete
  49. }
  50. func getObjectFieldValue(object Object, fieldName string) (*reflect.Value, error) {
  51. objectType := reflect.TypeOf(object)
  52. if objectType.Kind() != reflect.Pointer {
  53. return nil, fserr.New("object必须是结构指针类型")
  54. }
  55. if objectType.Kind() == reflect.Pointer && objectType.Elem().Kind() != reflect.Struct {
  56. return nil, fserr.New("object必须是结构指针类型")
  57. }
  58. objectValue := reflect.ValueOf(object)
  59. if objectType.Kind() == reflect.Pointer && !objectValue.IsValid() {
  60. return nil, fserr.New("object为nil")
  61. }
  62. fieldValue := objectValue.Elem().FieldByName(fieldName)
  63. return &fieldValue, nil
  64. }