mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-05-05 17:56:50 +08:00
copy map
This commit is contained in:
parent
a6f6915336
commit
775951a09f
@ -7,18 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func CopyAny(from, to interface{}) {
|
func CopyAny(from, to interface{}) {
|
||||||
t := reflect.ValueOf(to)
|
copyAny(reflect.ValueOf(from), reflect.Indirect(reflect.ValueOf(to)))
|
||||||
if t.Kind() == reflect.Ptr {
|
|
||||||
t = t.Elem()
|
|
||||||
}
|
|
||||||
if !t.CanSet() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
f := reflect.ValueOf(from)
|
|
||||||
if isBaseNil(f) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
copyAny(f, t)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyAny(from, to reflect.Value) {
|
func copyAny(from, to reflect.Value) {
|
||||||
@ -97,13 +86,19 @@ func getBaseZeroValue(t reflect.Type) reflect.Value {
|
|||||||
l++
|
l++
|
||||||
t = t.Elem()
|
t = t.Elem()
|
||||||
}
|
}
|
||||||
v := reflect.Zero(t)
|
v := reflect.New(t)
|
||||||
for i := 0; i < l; i++ {
|
if l == 0 {
|
||||||
t := reflect.New(v.Type())
|
v = v.Elem()
|
||||||
t.Elem().Set(v)
|
} else {
|
||||||
v = t
|
for i := 1; i < l; i++ {
|
||||||
|
t := reflect.New(v.Type())
|
||||||
|
t.Elem().Set(v)
|
||||||
|
v = t
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return v
|
r := reflect.New(v.Type()).Elem()
|
||||||
|
r.Set(v)
|
||||||
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func isBaseNil(v reflect.Value) bool {
|
func isBaseNil(v reflect.Value) bool {
|
||||||
@ -163,15 +158,35 @@ func copySlice(from, to reflect.Value) {
|
|||||||
temp := reflect.MakeSlice(to.Type(), 0, size)
|
temp := reflect.MakeSlice(to.Type(), 0, size)
|
||||||
elemTo := to.Type().Elem()
|
elemTo := to.Type().Elem()
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
itemTo := getBaseZeroValue(elemTo)
|
var itemTo reflect.Value
|
||||||
copyAny(from.Index(i), itemTo)
|
if item := from.Index(i); isBaseNil(item) {
|
||||||
|
itemTo = reflect.Zero(elemTo)
|
||||||
|
} else {
|
||||||
|
itemTo = getBaseZeroValue(elemTo)
|
||||||
|
copyAny(from.Index(i), itemTo)
|
||||||
|
}
|
||||||
temp = reflect.Append(temp, itemTo)
|
temp = reflect.Append(temp, itemTo)
|
||||||
}
|
}
|
||||||
to.Set(temp)
|
to.Set(temp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyMap(from, to reflect.Value) {
|
func copyMap(from, to reflect.Value) {
|
||||||
// todo copy map
|
to.Set(reflect.MakeMap(to.Type()))
|
||||||
|
toTypeKey := to.Type().Key()
|
||||||
|
toTypeVal := to.Type().Elem()
|
||||||
|
for r := from.MapRange(); r.Next(); {
|
||||||
|
key := getBaseZeroValue(toTypeKey)
|
||||||
|
copyAny(r.Key(), key)
|
||||||
|
var val reflect.Value
|
||||||
|
fVal := r.Value()
|
||||||
|
if isBaseNil(fVal) {
|
||||||
|
val = reflect.Zero(toTypeVal)
|
||||||
|
} else {
|
||||||
|
val = getBaseZeroValue(toTypeVal)
|
||||||
|
copyAny(fVal, val)
|
||||||
|
}
|
||||||
|
to.SetMapIndex(key, val)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func toString(value reflect.Value) string {
|
func toString(value reflect.Value) string {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user