以下工作正常:type MyStruct struct { MyField int32}func SetReflectConcrete(obj *MyStruct, fieldName string, newValue interface{}) { objElem := reflect.ValueOf(obj).Elem() field := objElem.FieldByName(fieldName) field.Set(reflect.ValueOf(newValue))}func main() { myStruct := MyStruct{123} SetReflectConcrete(myStruct, "MyField", int32{1234})}如何制作适用SetReflect于任何结构的函数变体?到目前为止我所有的尝试都失败了。签名会是这样的:func SetReflectInterface(obj interface{}, fieldName string, newValue interface{})当这样称呼它时,这甚至可能吗SetReflectInterface(myStruct, "MyField", int32{1234})或者它必须被称为像SetReflectInterface(&myStruct, "MyField", int32{1234})(毕竟,interface{}有一个指向该结构的指针。)
1 回答
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
将参数声明interface{}为您注意到的类型。将指针传递给结构体,如最后一个代码片段所示。
func SetReflectConcrete(obj interface{}, fieldName string, newValue interface{}) {
objElem := reflect.ValueOf(obj).Elem()
field := objElem.FieldByName(fieldName)
field.Set(reflect.ValueOf(newValue))
}
myStruct := MyStruct{123}
SetReflectConcrete(&myStruct, "MyField", int32(1234))
反射值必须是可寻址的才能设置字段。如果直接从结构创建该值将不可寻址。
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报
0/150
提交
取消