gpt4 book ai didi

go - 如何使用反射设置作为指向任意值的指针的结构成员

转载 作者:行者123 更新时间:2023-12-03 10:11:11 24 4
gpt4 key购买 nike

注意:我想和 How to set a struct member that is a pointer to a string using reflection in Go 一样,但以更通用的方式。现有的问题不能解决我的问题。
我有不同类型的字段的结构,我想使用反射来填充:

type MyStruct struct {
SomeInt int
SomeString string
SomeIntPtr *int
SomeStringPtr *string
}
我要写入各个字段的值从配置存储中检索并解析为正确的类型,类似于:
func getValueForField(fieldName string) interface{}
对于 int*int类型,函数返回 int (包装在一个界面中)。对于 string*string , 函数返回 string (在接口(interface)后面)等等,适用于所有类型。
--> 注意它是 不是 返回 *int/ *string !
现在我想将值分配给结构字段:
var field reflect.Value  = reflect.ValueOf(ptrToMyStruct).Elem().Field(i)
var value interface{} = getValueForField(....)
var isPointer bool = field.Kind() == reflect.Ptr

// assign "value" to "field":
if isPointer {
// ??
field.Set(reflect.ValueOf(value).Addr()) // panic: reflect.Value.Addr of unaddressable value
} else {
field.Set(reflect.ValueOf(value)) // works
}
将这些值分配给具体类型很容易并且可以按预期工作。但我无法分配 int类型(从 getValueForField 返回)为 *int字段没有以某种方式获得地址。因为我只有一个 interface{} ,这需要通过反射来完成。
这是 Go Playground 的链接: https://play.golang.org/p/zElEGHgx1IO

最佳答案

使用 reflect.New() 要为该字段构造一个新的指针值,请将指向的值设置为 value ,然后将此新值设置为指针字段。
例如:

type MyStruct struct {
SomeIntPtr *int
SomeStringPtr *string
}

var ms MyStruct

// Set int pointer
{
var i interface{} = 3 // of type int

f := reflect.ValueOf(&ms).Elem().FieldByName("SomeIntPtr")
x := reflect.New(f.Type().Elem())
x.Elem().Set(reflect.ValueOf(i))
f.Set(x)
}

// Set string pointer
{
var i interface{} = "hi" // of type string

f := reflect.ValueOf(&ms).Elem().FieldByName("SomeStringPtr")
x := reflect.New(f.Type().Elem())
x.Elem().Set(reflect.ValueOf(i))
f.Set(x)
}

fmt.Println("ms.SomeIntPtr", *ms.SomeIntPtr)
fmt.Println("ms.SomeStringPtr", *ms.SomeStringPtr)
这将输出(在 Go Playground 上尝试):
ms.SomeIntPtr 3
ms.SomeStringPtr hi
因此,您的代码可能如下所示:
// assign "value" to "field":
if isPointer {
x := reflect.New(field.Type().Elem())
x.Elem().Set(reflect.ValueOf(value))
field.Set(x)
} else {
field.Set(reflect.ValueOf(value)) // works
}

关于go - 如何使用反射设置作为指向任意值的指针的结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64138199/

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