我想与如何使用 Go 中的反射设置一个指向字符串的指针的结构成员相同,但以更通用的方式。现有的问题不能解决我的问题。
我有想要使用反射填充的不同类型字段的结构:
type MyStruct struct {
SomeInt int
SomeString string
SomeIntPtr *int
SomeStringPtr *string
}
我要写入各个字段的值从配置存储中检索并解析为正确的类型,类似于:
func getValueForField(fieldName string) interface{}
对于int和*int类型,该函数返回一个int(包装在一个接口中)。对于stringand *string,函数返回string(在接口后面)等等,适用于所有类型。
--> 请注意,它不返回*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
一只萌萌小番薯
相关分类