反射匿名struct字段指针

时间:2015-10-15 22:59:56

标签: pointers reflection struct go

我有这样的结构

  before_action :set_conversation, only: [:messagefilecreation]

  def messagefilecreation
    @uploader.key = params[:key]
    Message.create(conversation_id: @conversation.id, user_id: current_user.id, key: @uploader.key )
    redirect_to user_path(@conversation.recipient)
  end

和另一个像那样

type duration struct {
    time.Duration
}

我使用反射将标志分配给struct Config的字段。但是,对于type Config struct { Announce duration } 类型的特定用例,我被卡住了。 问题是,当我执行切换类型时,我得到duration而不是*config.duration。我如何访问匿名字段?

这是完整的代码

*time.Duration

由于

1 个答案:

答案 0 :(得分:1)

好的,经过一些挖掘,并且感谢我的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)
            }
        }
    }
}