繁体   English   中英

在指针接收器上调用 Elem() 方法以进行结构反射的必要性

[英]Necessity of calling Elem() method on pointer-receiver for struct reflection

我有结构

type ChartOpts struct {
    Name              mypakage.MyType
    Repo              mypakage.MyType
}

我想在其上设置一个反射接收器。

func (chartOpts *ChartOpts) BindFlags() {
    fields := reflect.TypeOf(chartOpts)
    values := reflect.ValueOf(chartOpts)
    num := fields.NumField()
    fmt.Println(fields, values, num)
}

上面的代码恐慌

panic: reflect: NumField of non-struct type *app.ChartOpts

为什么我需要调用Elem()方法来解决这个问题?

func (chartOpts *ChartOpts) BindFlags() {
    fields := reflect.TypeOf(chartOpts)
    values := reflect.ValueOf(chartOpts)
    num := fields.Elem().NumField()
    fmt.Println(fields, values, num)
}

因为chartOpts的类型是*ChartOpts ,一个指向ChartOpts类型的指针。 指针没有字段,只有结构。 在其类型描述符上调用Elem()将返回一个表示 / 描述ChartOpts的类型描述符,这是一种具有字段的结构类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM