Reflection 使用reflect.Set设置字段
我有密码Reflection 使用reflect.Set设置字段,reflection,go,Reflection,Go,我有密码 var t reflect.Type = LaunchController(route.controller) // create controller ptr . var appControllerPtr reflect.Value = reflect.New(t) fmt.Println(appControllerPtr) //#=> <**controller.AppController Value> var appContro
var t reflect.Type = LaunchController(route.controller)
// create controller ptr .
var appControllerPtr reflect.Value = reflect.New(t)
fmt.Println(appControllerPtr) //#=> <**controller.AppController Value>
var appController reflect.Value = appControllerPtr.Elem()
// Create and configure base controller
var c *Controller = &Controller{
Request: r,
Writer: w,
Name: t.Name(),
}
//this should assign *goninja.Controller field in application controllers
var controllerField reflect.Value = reflect.ValueOf(appController).Field(0)
controllerField.Elem().Set(reflect.ValueOf(c))
但是,当我试图用代码分配此字段时
controllerField.Elem().Set(reflect.ValueOf(c))
我面临以下错误
reflect: reflect.Value.Set using value obtained using unexported field
我做错了什么?我也不明白为什么我的
reflect.New(t)
返回reflect.Value
,开头有两个星号**
您没有给出完整的代码,所以我不得不猜测一下,但我怀疑AppController
结构的Controller
字段的大小写名称较低。对吗?下面是我尝试从代码中生成的一个最小示例:(使用大写字段名)和(使用小写字段名)
另外:在写入
reflect.ValueOf(appController).Field(0)
时,appController
的类型已经是reflect.Value
,因此不需要ValueOf
。您只需编写appController.Field(0)
,就像我上面链接的示例代码一样。我的结构appController的Controller字段就是嵌入字段。我已经检查了是否有未移植的字段,但没有可用的字段。还有一个原因是我做了2倍于ValueOf的操作-否则我会出现错误reflect:ptr Value上reflect.Value.FieldByName的调用
。更新了带有注释的代码。您能否提供显示错误消息的完整代码(例如,在play.golang.org上)?由于我没有几个不同的模块,不确定如何才能做到这一点
reflect: reflect.Value.Set using value obtained using unexported field