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:我不知道你的意思,因为没有类型你无法制作一个切片。你试过看看会发生什么吗?