36 lines
623 B
Go
36 lines
623 B
Go
|
package dataext
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
)
|
||
|
|
||
|
func ObjectMerge[T1 any, T2 any](base T1, override T2) T1 {
|
||
|
|
||
|
reflBase := reflect.ValueOf(&base).Elem()
|
||
|
reflOvrd := reflect.ValueOf(&override).Elem()
|
||
|
|
||
|
for i := 0; i < reflBase.NumField(); i++ {
|
||
|
|
||
|
fieldBase := reflBase.Field(i)
|
||
|
fieldOvrd := reflOvrd.Field(i)
|
||
|
|
||
|
if fieldBase.Kind() != reflect.Ptr || fieldOvrd.Kind() != reflect.Ptr {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
kindBase := fieldBase.Type().Elem().Kind()
|
||
|
kindOvrd := fieldOvrd.Type().Elem().Kind()
|
||
|
|
||
|
if kindBase != kindOvrd {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if !fieldOvrd.IsNil() {
|
||
|
fieldBase.Set(fieldOvrd.Elem().Addr())
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return base
|
||
|
}
|