@@ -5,10 +5,16 @@ import (
55 "unsafe"
66)
77
8+ type pointerInterface struct {
9+ Type , Data unsafe.Pointer
10+ }
11+
812// Merge deeply merges two objects
13+ // object MUST be a pointer of a pointer
14+ // overwriteObject MUST be a pointer
915func Merge (object interface {}, overwriteObject interface {}) {
10- objectPointerUnsafe := unsafe .Pointer (& object )
11- overwriteObjectPointerUnsafe := unsafe .Pointer (& overwriteObject )
16+ objectPointerUnsafe := ( * ( * pointerInterface )( unsafe .Pointer (& object ))). Data
17+ overwriteObjectPointerUnsafe := ( * ( * pointerInterface )( unsafe .Pointer (& overwriteObject ))). Data
1218
1319 merge (object , overwriteObject , objectPointerUnsafe , overwriteObjectPointerUnsafe )
1420}
@@ -20,14 +26,15 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
2026 if overwriteObjectRef .Kind () == reflect .Ptr {
2127 overwriteObjectRef = overwriteObjectRef .Elem ()
2228 }
29+ objectPointerReal := reflect .ValueOf (objectPointer ).Elem ().Interface ()
2330 overwriteObject := overwriteObjectRef .Interface ()
2431 overwriteObjectType := reflect .TypeOf (overwriteObject )
2532 overwriteObjectKind := overwriteObjectType .Kind ()
26- objectPointerRef := reflect .ValueOf (objectPointer )
33+ objectPointerRef := reflect .ValueOf (objectPointerReal )
2734 var objectRef reflect.Value
2835
2936 if ! objectPointerRef .IsNil () {
30- objectRef = reflect .ValueOf (objectPointer ).Elem ()
37+ objectRef = reflect .ValueOf (objectPointerReal ).Elem ()
3138 }
3239
3340 switch overwriteObjectKind {
@@ -55,7 +62,7 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
5562 if isZero (valuePointerRef ) == false {
5663 valuePointer := valuePointerRef .Interface ()
5764
58- merge ( valuePointer , overwriteValue , unsafe . Pointer ( & valuePointer ), unsafe . Pointer ( & overwriteValue ) )
65+ Merge ( & valuePointer , overwriteValue )
5966 } else {
6067 keyRef := reflect .ValueOf (key )
6168 overwriteValueRef := reflect .ValueOf (overwriteValue )
@@ -66,7 +73,6 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
6673 }
6774 case reflect .Struct :
6875 for i := 0 ; i < overwriteObjectRef .NumField (); i ++ {
69- //fieldName := objectRef.Type().Field(i).Name
7076 overwriteValueRef := overwriteObjectRef .Field (i )
7177 overwriteValuePointerRef := reflect .ValueOf (overwriteValueRef .Interface ())
7278
@@ -75,11 +81,11 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
7581 valuePointerRef := objectRef .Field (i )
7682
7783 if valuePointerRef .IsNil () {
78- objectRef . Field ( i ) .Set (reflect .ValueOf (overwriteValue ))
84+ valuePointerRef .Set (reflect .ValueOf (overwriteValue ))
7985 } else {
80- valuePointer := objectRef . Field ( i ) .Interface ()
86+ valuePointer := valuePointerRef .Interface ()
8187
82- merge ( valuePointer , overwriteValue , unsafe . Pointer ( & valuePointer ), unsafe . Pointer ( & overwriteValue ) )
88+ Merge ( & valuePointer , overwriteValue )
8389 }
8490 }
8591 }
0 commit comments