Pointers 当字段是指向x的指针时,设置带反射的结构字段的值

Pointers 当字段是指向x的指针时,设置带反射的结构字段的值,pointers,go,reflection,struct,Pointers,Go,Reflection,Struct,我已经检查了很多反映问题,现在我已经使用了很多,但是我还没有找到解决这个问题的方法 基本上,我有一个指向各种原语的指针结构。结构是应用程序的配置,字段是指针的原因是,我可以在设置为默认值的字段和未设置的字段之间进行判断,以强制执行“必需”字段 最后我将链接源代码,但现在让我们使用一个简单的示例: type Config struct { A *string B *int C *bool D *[]string // wildcard! } 因此,我通过refle

我已经检查了很多反映问题,现在我已经使用了很多,但是我还没有找到解决这个问题的方法

基本上,我有一个指向各种原语的指针结构。结构是应用程序的配置,字段是指针的原因是,我可以在设置为默认值的字段和未设置的字段之间进行判断,以强制执行“必需”字段

最后我将链接源代码,但现在让我们使用一个简单的示例:

type Config struct {
    A *string
    B *int
    C *bool
    D *[]string // wildcard!
}
因此,我通过
reflect.ValueOf(*cfg)
获取
reflect.Value
,它在每个元素上为我提供了一个
.Field
,我对其进行了迭代

问题是,每个元素都不能通过
CanAddr
CanSet
,我似乎找不到一种方法来设置指针后面的值。这是语言的限制吗?我是否需要将字段设为非指针?这很糟糕,因为无法确定用户是否指定了空字符串,或者根本没有设置它

哦,设置/附加[]字符串字段可获得额外积分!那一次连混音中的指针都没有,把我弄糊涂了

无论如何,相关代码如下:

替换这些行:

t := reflect.TypeOf(*cfg)
v := reflect.ValueOf(*cfg)

获取可寻址的值

reflect.ValueOf(*cfg)
创建的值没有对可寻址内存的引用。解决方法是取消对反射域中指针的引用

关于[]字符串。因为空片和空片之间有区别,所以可能不需要使用*[]字符串。在任何情况下,都可以使用reflect.Append函数附加到切片:

var s []string
v := reflect.ValueOf(&s).Elem()
v.Set(reflect.Append(v, reflect.ValueOf("hello")))
v.Set(reflect.Append(v, reflect.ValueOf("world")))
fmt.Println(s) // prints [hello world]
var s []string
v := reflect.ValueOf(&s).Elem()
v.Set(reflect.Append(v, reflect.ValueOf("hello")))
v.Set(reflect.Append(v, reflect.ValueOf("world")))
fmt.Println(s) // prints [hello world]