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]