gpt4 book ai didi

go - 访问函数内部结构的指针值

转载 作者:IT王子 更新时间:2023-10-29 01:58:06 24 4
gpt4 key购买 nike

我想将一个结构对象传递给一个函数并且能够从该函数访问它的指针值。我无法理解为什么以下会导致错误。

func GetStructFieldPointers(u interface{}, jsonFields []string) []interface{} {
structVal := reflect.ValueOf(&u).Elem()
structType := reflect.TypeOf(u)
numberOfFields := structVal.NumField() // getting error here reflect:
// call of reflect.Value.NumField
// on interface Value
numberOfJSONFields := len(jsonFields)
res := make([]interface{}, numberOfJSONFields)
fmt.Println(jsonFields)
for fieldIndex, field := range jsonFields {
for i := 0; i < numberOfFields; i++ {
if structType.Field(i).Tag.Get("json") == field {
valueField := structVal.Field(i)
res[fieldIndex] = valueField.Addr().Interface()
}
}
}

return res
}

type User struct {
Id int `json:"id"`
Name string `json:"name"`
Address string `json:"address"`
}
user := User{}
res := GetStructFieldPointers(user, []string{"id", "name"})

为了完成这项工作,我必须将 structType 作为参数,如下所示:

func GetStructFieldPointers(u interface{}, structType reflect.Type, jsonFields []string) []interface{} {
structVal := reflect.ValueOf(u).Elem()
// structType := reflect.TypeOf(u)
numberOfFields := structVal.NumField()
numberOfJSONFields := len(jsonFields)
res := make([]interface{}, numberOfJSONFields)
fmt.Println(jsonFields)
for fieldIndex, field := range jsonFields {
for i := 0; i < numberOfFields; i++ {
if structType.Field(i).Tag.Get("json") == field {
valueField := structVal.Field(i)
res[fieldIndex] = valueField.Addr().Interface()
}
}
}

return res
}

user := User{}
res := GetStructFieldPointers(&user, reflect.TypeOf(user), []string{"id", "name"})

我想知道如何将 User{} 作为参数传递并在 reflect.ValueOf 和 reflect.TypeOf 调用中使用。

最佳答案

在这一行:structVal := reflect.ValueOf(&u).Elem() 你正在获取一个接口(interface)的地址(你的函数的参数)而不是接口(interface)的地址基础值,然后将指针传递给 ValueOf,因此 .Elem() 调用返回指针指向的“elem 值”,即接口(interface),而不是结构。

如果您知道传入的值是结构而不是指针这一事实,您只需要这样:structVal := reflect.ValueOf(u)

如果将指针传递给您的函数,例如 GetStructFieldPointers(&u, ... 那么这就是您想要的:structVal := reflect.ValueOf(u).Elem()

但您也可以通过检查值的种类来处理这两种情况。

rv := reflect.ValueOf(u)
if rv.Kind() == reflect.Ptr {
rv = rv.Elem()
}
if rv.Kind() == reflect.Struct {
fmt.Println(rv.NumField())
}

https://play.golang.org/p/9F9LNnwEaH

更新:仔细查看您的代码...如果您希望能够获取结构字段的地址,则需要将指向该结构的指针作为参数传递,否则这些字段将无法寻址。

https://play.golang.org/p/RaA2rau3s-

关于go - 访问函数内部结构的指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43406888/

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