copy.go 816 B

123456789101112131415161718192021222324252627
  1. package utils
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. func CopyWithReflection(src interface{}, dst interface{}) error {
  7. srcValue := reflect.ValueOf(src)
  8. dstValue := reflect.ValueOf(dst)
  9. if srcValue.Kind() != reflect.Struct || dstValue.Kind() != reflect.Struct {
  10. return fmt.Errorf("both src and dst must be structs")
  11. }
  12. for i := 0; i < srcValue.NumField(); i++ {
  13. srcField := srcValue.Field(i)
  14. dstField := dstValue.FieldByName(srcValue.Type().Field(i).Name)
  15. if !dstField.IsValid() {
  16. continue // 如果目标结构体没有该字段,则跳过
  17. }
  18. // 检查类型是否匹配,如果需要转换类型,可以在这里添加转换代码
  19. if srcField.Type() != dstField.Type() {
  20. return fmt.Errorf("field types don't match: %s", srcValue.Type().Field(i).Name)
  21. }
  22. dstField.Set(srcField)
  23. }
  24. return nil
  25. }