Golang使用reflect设置struct field

时间:2016-07-27 10:27:57

标签: go reflection

我目前正在做以下

func Test(controller interface{}) {
    controllerType := reflect.TypeOf(controller)
    controllerFunc := reflect.ValueOf(controller)
    controllerStruct := reflect.New(controllerType.In(0))
    for i := 0; i < controllerStruct.Elem().NumField(); i++ {
        if controllerStruct.Elem().Field(i).Kind().String() == "ptr" {
            controllerStruct.Elem().Field(i).Set(
                reflect.New(
                    controllerStruct.Elem().Field(i).Type(),
                ).Elem(),
            )
        }
    }
    controllerFunc.Call([]reflect.Value{
        controllerStruct.Elem(),
    })
}

使用以下函数调用

Test(controllers.Test.IsWorking)

type Test struct {
    Name string
    H    *Hello
}

type Hello struct {
    Friend string
}

func (t Test) IsWorking() {
    log.Println(t.H)
}
即使我在for循环中设置它,

t.H总是nil。此外,我不确定这是否是正确的方法,因为如果Hello struct包含另一个指向结构的指针。有没有更好的方法来实现我想要做的事情,为什么t.H nil如果我正在设置

1 个答案:

答案 0 :(得分:1)

t.H为零,因为您在Set方法中提供的值不正确。您的Value返回reflect.New reflect.New(...).Elem()Hello类型,*Hello类型和H字段类型是*Hello类型)。如果您将H字段的类型更改为Hello类型,您会看到它已初始化好了然后,您应该这样做:

controllerStruct.Elem().Field(i).Set(
    reflect.New(
        controllerStruct.Elem().Field(i).Type().Elem(),
    ),
)

reflect.New(controllerStruct.Elem().Field(i).Type().Elem())的值是一个新的*Hello结构。

我希望它对你有用! : - )