func MergeMap(data1 interface{}, data2 interface{}) (map[string]interface{}, error) {
if data1 == nil || data2 == nil {
return nil, errors.New("data1 or data2 not to be empty")
} else if reflect.ValueOf(data1).Kind().String() != reflect.Map.String() || reflect.ValueOf(data2).Kind().String() != reflect.Map.String() {
return nil, errors.New("data1 or data2 must be map type")
}
mutex := sync.RWMutex{}
map1 := make(map[string]interface{})
map2 := make(map[string]interface{})
res := make(map[string]interface{})
safeMap := atomic.Value{}
map1Bytes, err := json.Marshal(&data1)
if err != nil {
return nil, err
}
map2Bytes, err := json.Marshal(&data2)
if err != nil {
return nil, err
}
if err := json.Unmarshal(map1Bytes, &map1); err != nil {
return nil, err
}
if err := json.Unmarshal(map2Bytes, &map2); err != nil {
return nil, err
}
for k, v := range map1 {
mutex.Lock()
safeMap.Store(res)
res[k] = v
mutex.Unlock()
}
for k, v := range map2 {
mutex.Lock()
safeMap.Store(res)
res[k] = v
mutex.Unlock()
}
res = safeMap.Load().(map[string]interface{})
return res, nil
}