我目前正在做以下
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
如果我正在设置
答案 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
结构。
我希望它对你有用! : - )