Go 反射。将structs值的slice设置为一个struct,而不使用类型断言(因为它是未知的)

Go 反射。将structs值的slice设置为一个struct,而不使用类型断言(因为它是未知的),go,reflection,Go,Reflection,我正在创建一个助手包,以从队列中弹出有效负载。这个助手必须与导入它的应用程序所使用的结构无关 此(无操作,仅为示例)函数将从队列中提供一个负载,其类型类似于接口{}: func One(like interface{}) interface{} { typ := reflect.TypeOf(like) one := reflect.New(typ) return one.Interface() } 此功能提供了许多有效载荷: func Many(num int, l

我正在创建一个助手包,以从队列中弹出有效负载。这个助手必须与导入它的应用程序所使用的结构无关

此(无操作,仅为示例)函数将从队列中提供一个负载,其类型类似于接口{}:

func One(like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    one := reflect.New(typ)

    return one.Interface()
}
此功能提供了许多有效载荷:

func Many(num int, like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    many := reflect.MakeSlice(reflect.SliceOf(typ), num, num)

    for i := 0; i < num; i++ {
        one := One(typ)
        many.Index(i).Set(one)
    }

    return many.Interface()
}
然而,上述结果导致:

panic: reflect.Set: value of type **reflect.rtype is not assignable to type main.Payload

您正在调用
reflect.Value
上的
reflect.TypeOf
,这就是
**reflect.rtype
的来源

直接用
like
值调用
One
函数,并将结果分配给切片

func One(like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    one := reflect.New(typ)

    return one.Interface()
}

func Many(num int, like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    many := reflect.MakeSlice(reflect.SliceOf(typ), num, num)

    for i := 0; i < num; i++ {
        one := One(like)
        many.Index(i).Set(reflect.ValueOf(one).Elem())
    }

    return many.Interface()
}
func-One(类似接口{})接口{}{
类型:=反射.TypeOf(like)
一:=反映新(典型)
返回1.Interface()
}
func-Many(num-int,类似于接口{})接口{}{
类型:=反射.TypeOf(like)
many:=reflect.MakeSlice(reflect.SliceOf(典型)、num、num)
对于i:=0;i

您正在调用
reflect.Value
上的
reflect.TypeOf
,这就是
**reflect.rtype
的来源

直接用
like
值调用
One
函数,并将结果分配给切片

func One(like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    one := reflect.New(typ)

    return one.Interface()
}

func Many(num int, like interface{}) interface{} {
    typ := reflect.TypeOf(like)
    many := reflect.MakeSlice(reflect.SliceOf(typ), num, num)

    for i := 0; i < num; i++ {
        one := One(like)
        many.Index(i).Set(reflect.ValueOf(one).Elem())
    }

    return many.Interface()
}
func-One(类似接口{})接口{}{
类型:=反射.TypeOf(like)
一:=反映新(典型)
返回1.Interface()
}
func-Many(num-int,类似于接口{})接口{}{
类型:=反射.TypeOf(like)
many:=reflect.MakeSlice(reflect.SliceOf(典型)、num、num)
对于i:=0;i

是否可以删除reflect.SliceOf(典型)并获得相同的结果?@fvarj:我不知道你的意思,因为没有类型就无法制作切片。你试过看看会发生什么吗?有可能删除reflect.SliceOf(典型)并得到相同的结果吗?@fvarj:我不知道你的意思,因为没有类型你无法制作一个切片。你试过看看会发生什么吗?