@@ -5,16 +5,20 @@ 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 )(unsafe .Pointer (& overwriteObject ))
16+ objectPointerUnsafe := ( * ( * pointerInterface )( unsafe .Pointer (& object ))). Data
17+ overwriteObjectPointerUnsafe := ( * (* pointerInterface )(unsafe .Pointer (& overwriteObject ))). Data
1218
13- merge (& object , overwriteObject , objectPointerUnsafe , overwriteObjectPointerUnsafe )
19+ merge (object , overwriteObject , objectPointerUnsafe , overwriteObjectPointerUnsafe )
1420}
1521
16- // objectPointer MUST be a pointer of a pointer
17- // objectPointerUnsafe MUST be an unsafe pointer of a pointer
1822func merge (objectPointer interface {}, overwriteObjectPointer interface {}, objectPointerUnsafe unsafe.Pointer , overwriteObjectPointerUnsafe unsafe.Pointer ) {
1923 overwriteObjectRef := reflect .ValueOf (overwriteObjectPointer )
2024
@@ -55,10 +59,10 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
5559 overwriteValue := getMapValue (overwriteObject , key , genericPointerType )
5660 valuePointerRef := objectRef .MapIndex (keyRef )
5761
58- if isZero (valuePointerRef ) == false && isTrivialDataType ( valuePointerRef ) {
62+ if isZero (valuePointerRef ) == false {
5963 valuePointer := valuePointerRef .Interface ()
6064
61- merge (& valuePointer , overwriteValue , unsafe . Pointer ( & valuePointer ), * ( * unsafe . Pointer )( unsafe . Pointer ( & overwriteValue )) )
65+ Merge (& valuePointer , overwriteValue )
6266 } else {
6367 keyRef := reflect .ValueOf (key )
6468 overwriteValueRef := reflect .ValueOf (overwriteValue )
@@ -76,33 +80,17 @@ func merge(objectPointer interface{}, overwriteObjectPointer interface{}, object
7680 overwriteValue := overwriteValueRef .Interface ()
7781 valuePointerRef := objectRef .Field (i )
7882
79- if valuePointerRef .IsNil () || isTrivialDataType ( valuePointerRef ) {
83+ if valuePointerRef .IsNil () {
8084 valuePointerRef .Set (reflect .ValueOf (overwriteValue ))
8185 } else {
8286 valuePointer := valuePointerRef .Interface ()
8387
84- merge (& valuePointer , overwriteValue , unsafe . Pointer ( & valuePointer ), * ( * unsafe . Pointer )( unsafe . Pointer ( & overwriteValue )) )
88+ Merge (& valuePointer , overwriteValue )
8589 }
8690 }
8791 }
8892 default :
89- panic ( "Unable to merge trivial data types" )
93+ * ( * unsafe . Pointer )( objectPointerUnsafe ) = overwriteObjectPointerUnsafe
9094 }
9195 }
9296}
93-
94- func isTrivialDataType (value reflect.Value ) bool {
95- if value .Type ().Kind () == reflect .Ptr {
96- value = value .Elem ()
97- }
98-
99- switch reflect .TypeOf (value ).Kind () {
100- case reflect .Slice :
101- return false
102- case reflect .Map :
103- return false
104- case reflect .Struct :
105- return false
106- }
107- return true
108- }
0 commit comments