使用reflect.Set设置字段

时间:2015-06-07 15:38:50

标签: 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 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))

这会创建指向元素的指针,然后尝试将值赋入此结构的0字段。

我的结构,我试图反映看起来像

type AppController struct {
  *goninja.Controller
}

但是,当我尝试使用代码

分配此字段时
controllerField.Elem().Set(reflect.ValueOf(c))

我正面临以下错误

reflect: reflect.Value.Set using value obtained using unexported field

我做错了什么?此外,我无法理解为什么我的reflect.New(t)会在reflect.Value

开始时以2个星号返回**

1 个答案:

答案 0 :(得分:2)

你没有提供完整的代码,所以我不得不猜一下,但我怀疑Controller结构的AppController字段有一个小写的名字。对?以下是我尝试从您的代码中生成一个最小示例:working(带大写字段名称)和non-working(带小写字段名称)。

另外:在您撰写reflect.ValueOf(appController).Field(0)的位置,appController已经是reflect.Value类型,因此不需要ValueOf。您可以像我上面链接的示例代码一样编写appController.Field(0)

相关问题