gpt4 book ai didi

Golang 使用反射设置结构字段

转载 作者:IT王子 更新时间:2023-10-29 02:13:39 25 4
gpt4 key购买 nike

我目前正在做以下事情

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)
}

t.H 始终是 nil 即使我将它设置在 for 循环中也是如此。我也不确定这是否是正确的方法,因为如果 Hello 结构包含另一个指向结构的指针怎么办。有没有更好的方法来实现我正在尝试做的事情,为什么 t.H nil 如果我正在设置它

最佳答案

t.H 为 nil,因为您在 Set 方法中给出的值不正确。您正在获取 reflect.New 返回的 Value(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 结构。

希望对你有用! :-)

关于Golang 使用反射设置结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38610383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com