报错时的情景:
panic: reflect: call of reflect.Value.Elem on struct Value [recovered]
?? ?panic: reflect: call of reflect.Value.Elem on struct Value
基于反射给结构体赋值时出现的。
看看出问题的代码:
ms := Abc{}
sValue := reflect.ValueOf(ms).Elem()
sValue.Field(i).SetString("xxx")
原因正如所提示,在调用Elem时不能作用在结构体上,那怎么弄?
ms := &Abc{}
sValue := reflect.ValueOf(ms).Elem()
sValue.Field(i).SetString("xxx")
传指针,这样就OK了!
另外看Elem()方法的注释也能看出来:
// Elem returns the value that the interface v contains
// or that the pointer v points to.
// It panics if v's Kind is not Interface or Pointer.
// It returns the zero Value if v is nil.
func (v Value) Elem() Value {
...
}
即如果不是Interface or Pointer就会panic。