我有一个指向各种基元的指针结构。该结构是应用程序的配置,字段是指针的原因是这样我可以确定设置为默认值的字段和根本未设置的字段 - 以强制执行“必需”字段。
这是一个简单的例子:
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)
与
v := reflect.ValueOf(cfg).Elem()
t := v.Type()
获取可寻址值。
reflect.ValueOf(*cfg)
创建的值没有对可寻址内存的引用。解决方法是取消引用反射域中的指针。
关于 [] 字符串。因为 null slice 和空 slice 之间存在差异,所以可能不需要使用 *[]string。在任何情况下,使用 reflect.Append 函数追加到 slice :
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]
关于pointers - 当字段是指向 x 的指针时,使用反射设置结构字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46354574/