需要对接口进行动态类型断言

时间:2017-04-24 03:35:10

标签: go interface

我想将值从一个结构复制到另一个结构。我将多次使用此函数,并且每次传递不同结构类型的对象。所以我使用泛型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。

0 个答案:

没有答案