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.
|
- package reflect2
-
- import "reflect"
-
- // MergeNonZero 将 src 中非零值字段复制到 dst 中
- func MergeNonZero(dst, src any) {
- dstVal := reflect.ValueOf(dst).Elem()
- srcVal := reflect.ValueOf(src).Elem()
-
- for i := 0; i < dstVal.NumField(); i++ {
- dstField := dstVal.Field(i)
- srcField := srcVal.Field(i)
-
- // 如果 src 字段是零值,则跳过
- if isZero(srcField) {
- continue
- }
-
- // 如果 dst 字段可设置,才设置
- if dstField.CanSet() {
- dstField.Set(srcField)
- }
- }
- }
-
- func isZero(v reflect.Value) bool {
- zero := reflect.Zero(v.Type())
- return reflect.DeepEqual(v.Interface(), zero.Interface())
- }
|