You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

assign.go 631 B

1234567891011121314151617181920212223242526272829
  1. package reflect2
  2. import "reflect"
  3. // MergeNonZero 将 src 中非零值字段复制到 dst 中
  4. func MergeNonZero(dst, src any) {
  5. dstVal := reflect.ValueOf(dst).Elem()
  6. srcVal := reflect.ValueOf(src).Elem()
  7. for i := 0; i < dstVal.NumField(); i++ {
  8. dstField := dstVal.Field(i)
  9. srcField := srcVal.Field(i)
  10. // 如果 src 字段是零值,则跳过
  11. if isZero(srcField) {
  12. continue
  13. }
  14. // 如果 dst 字段可设置,才设置
  15. if dstField.CanSet() {
  16. dstField.Set(srcField)
  17. }
  18. }
  19. }
  20. func isZero(v reflect.Value) bool {
  21. zero := reflect.Zero(v.Type())
  22. return reflect.DeepEqual(v.Interface(), zero.Interface())
  23. }