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()) }