上下文:我正在尝试使用 any struct,并用随机数据填充它。
目前我最大的症结是,如果 astruct有一个字段是指针类型的切片(即。[]*Foo),我无法弄清楚如何使用反射为该结构创建数据。
这是我的功能目前的样子:
func randFill(in interface{}) interface{} {
t := reflect.TypeOf(in)
v := reflect.ValueOf(in)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
switch v.Kind() {
case reflect.Struct:
newStr := reflect.New(t).Elem()
for i := 0; i < t.NumField(); i++ {
newV := randFill(reflect.New(t.Field(i).Type).Interface())
newStr.Field(i).Set(reflect.ValueOf(newV))
}
return newStr.Interface()
case reflect.Slice:
num := rand.Intn(10)
slice := reflect.MakeSlice(v.Type(), num, num)
for j := 0; j < num; j++ {
newC := slice.Index(j)
if newC.Kind() == reflect.Ptr {
ncInt := reflect.New(newC.Type())
newC = ncInt.Elem()
}
gen := randFill(newC.Interface())
slice.Index(j).Set(reflect.ValueOf(gen))
}
return slice.Interface()
//
// ... there are other cases down here for handling primitives
//
}
return nil
}
这在没有指针类型的切片上效果很好,但这里有一个它遇到问题的结构的示例:
type Parent struct {
Name string
Age int
Children []*Child
}
type Child struct {
Name string
Age int
}
如果我创建了 aParent{}并将其传递给randFill(Parent{}),则它无法生成值,*Child因为当它到达这一行时:
newC := slice.Index(j)
此时的值,newC在处理 的切片时,[]*Child是(*Child)(nil)一个reflect.Value类型。
newC := slice.Index(j)
fmt.Printf("%#v, %T", newC, newC) // Outputs: (*Child)(nil), reflect.Value
在能够从 a 初始化指针类型时,我缺少一些东西reflect.Value,或者我创建了不正确的切片类型,这就是我的问题的根源吗?
杨__羊羊
DIEA
相关分类