为了账号安全,请及时绑定邮箱和手机立即绑定

反射匿名结构域指针

反射匿名结构域指针

Go
犯罪嫌疑人X 2021-11-15 16:47:53
我有一个这样的结构type duration struct {    time.Duration}还有一个这样的type Config struct {    Announce duration}我正在使用反射为结构配置的字段分配标志。但是,对于 type 的特定用例duration,我被卡住了。问题是,当我执行 switch 类型时,我得到了*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)            }        }    }}谢谢
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

好了,一些挖后,并感谢我的IDE,我发现,使用的方法elem()上ptr谁返回一个指针*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)

            }

        }

    }

}


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信