object.go 1.9 KB

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