我想将值从一个结构复制到另一个结构。我将多次使用此函数,并且每次传递不同结构类型的对象。所以我使用泛型interface{}
类型作为函数的参数。
供参考,请查看此代码https://play.golang.org/p/d6JDySAU0v
func CopyStruct(oldValue interface{}, newValue interface{}) interface{} {
/*Please do note that the arguments oldValue and newValue of CopyStruct function is
of different struct types.*/
oldReflect := reflect.ValueOf(oldValue)
newReflect := reflect.ValueOf(newValue)
newReflectAdd := reflect.ValueOf(&newValue)
for i := 0; i < oldReflect.NumField(); i++ {
field := oldReflect.Field(i)
ValueType := oldReflect.Type().Field(i)
for j := 0; j < newReflect.NumField(); j++ {
newType := newReflect.Type().Field(j)
switch field.Kind() {
case reflect.String:
if ValueType.Name == newType.Name {
newReflect.Elem().FieldByName(newType.Name).SetString(field.String())
}
case reflect.Int:
if ValueType.Name == newType.Name {
newReflectAdd.Elem().FieldByName(newType.Name).SetInt(field.Int())
}
}
}
}
return newReflectAdd
}
上面的代码产生以下错误:
Handler crashed with error reflect: call of reflect.Value.FieldByName on interface Value
似乎错误是以下行:
newReflectAdd.Elem().FieldByName(newType.Name).SetString(field.String())
但如果我在此行之前使用newValue
类型断言,则没有错误。
typeAssert := newValue.(Info)
newReflectAdd := reflect.ValueOf(&typeAssert)
由于我将使用此函数作为许多结构类型的通用函数,我不知道如何动态键入assert。