我有这样的结构
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
由于
答案 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)
}
}
}
}