2 回答
![?](http://img1.sycdn.imooc.com/545850200001359c02200220-100-100.jpg)
TA贡献1943条经验 获得超7个赞
当你发现 put 元素是一个指针时,你必须创建一个指针指向的类型的实例,但你正在创建一个新指针。试试这个:
if newC.Kind() == reflect.Ptr {
ncInt := reflect.New(newC.Type().Elem())
newC = ncInt.Elem()
}
![?](http://img1.sycdn.imooc.com/54584dd900014f6c02200220-100-100.jpg)
TA贡献1820条经验 获得超2个赞
一种简单的方法是编写一个函数,用随机数据填充 reflect.Value。该函数为结构化值(切片、结构......)递归调用自身。
func randFillValue(v reflect.Value) {
switch v.Kind() {
case reflect.Ptr:
v.Set(reflect.New(v.Type().Elem()))
randFillValue(v.Elem())
case reflect.Struct:
for i := 0; i < v.NumField(); i++ {
randFillValue(v.Field(i))
}
case reflect.Slice:
num := rand.Intn(10)
v.Set(reflect.MakeSlice(v.Type(), num, num))
for i := 0; i < num; i++ {
randFillValue(v.Index(i))
}
case reflect.Int:
v.SetInt(10) // TODO: fill with random int
case reflect.String:
v.SetString("random string") // TODO: fill with random string
}
// TODO: add other reflect.Kind
}
// randFill fills the value pointed to pv with random values.
func randFill(pv interface{}) {
randFillValue(reflect.ValueOf(pv).Elem())
}
在操场上运行它。
与问题中的代码相比,此代码中有一些简化。首先是这个答案通过使用来避免reflect.ValueOfand.Interface()调用reflect.Value。第二个是指针作为顶级案例处理,从而消除了切片元素和字段代码中指针相关代码的需要。
- 2 回答
- 0 关注
- 155 浏览
添加回答
举报