Pointers 反射匿名结构字段指针
我有一个这样的结构Pointers 反射匿名结构字段指针,pointers,reflection,struct,go,Pointers,Reflection,Struct,Go,我有一个这样的结构 type duration struct { time.Duration } 还有一个这样的 type Config struct { Announce duration } 我使用反射将标志分配给struct Config的字段。然而,对于类型为duration的特定用例,我被卡住了。 问题是,当我执行开关类型时,我得到的是*config.duration,而不是*time.duration。如何访问匿名字段 这是完整的代码 func assignFla
type duration struct {
time.Duration
}
还有一个这样的
type Config struct {
Announce duration
}
我使用反射将标志分配给struct Config的字段。然而,对于类型为duration
的特定用例,我被卡住了。
问题是,当我执行开关类型时,我得到的是*config.duration
,而不是*time.duration
。如何访问匿名字段
这是完整的代码
func assignFlags(v interface{}) {
// Dereference into an adressable value
xv := reflect.ValueOf(v).Elem()
xt := xv.Type()
for i := 0; i < xt.NumField(); i++ {
f := xt.Field(i)
// Get tags for this field
name := f.Tag.Get("long")
short := f.Tag.Get("short")
usage := f.Tag.Get("usage")
addr := xv.Field(i).Addr().Interface()
// Assign field to a flag
switch ptr := addr.(type) { // i get `*config.duration` here
case *time.Duration:
if len(short) > 0 {
// note that this is not flag, but pflag library. The type of the first argument muste be `*time.Duration`
flag.DurationVarP(ptr, name, short, 0, usage)
} else {
flag.DurationVar(ptr, name, 0, usage)
}
}
}
}
func赋值标志(v接口{}){
//解除对可寻址值的引用
xv:=反映(v)元素()的值
xt:=xv.Type()
对于i:=0;i0{
//请注意,这不是标志,而是pflag库。第一个参数的类型必须为“*time.Duration”`
flag.DurationVarP(ptr,name,short,0,用法)
}否则{
flag.DurationVar(ptr,name,0,用法)
}
}
}
}
谢谢好的,经过一些挖掘,感谢我的IDE,我发现使用
ptr
上的elem()
方法返回指针*time.Duration
就可以了。如果我直接使用&ptr.Duration
这是工作代码
func (d *duration) elem() *time.Duration {
return &d.Duration
}
func assignFlags(v interface{}) {
// Dereference into an adressable value
xv := reflect.ValueOf(v).Elem()
xt := xv.Type()
for i := 0; i < xt.NumField(); i++ {
f := xt.Field(i)
// Get tags for this field
name := f.Tag.Get("long")
short := f.Tag.Get("short")
usage := f.Tag.Get("usage")
addr := xv.Field(i).Addr().Interface()
// Assign field to a flag
switch ptr := addr.(type) {
case *duration:
if len(short) > 0 {
flag.DurationVarP(ptr.elem(), name, short, 0, usage)
} else {
flag.DurationVar(ptr.elem(), name, 0, usage)
}
}
}
}
func(d*duration)elem()*time.duration{
返回和d.d.持续时间
}
func assignFlags(v接口{}){
//解除对可寻址值的引用
xv:=反映(v)元素()的值
xt:=xv.Type()
对于i:=0;i0{
flag.DurationVarP(ptr.elem(),name,short,0,用法)
}否则{
flag.DurationVar(ptr.elem(),名称,0,用法)
}
}
}
}