我有结构

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的类型描述符,ojit_code是具有字段的结构类型。

关于pointers - 在指针接收器上调用Elem()方法以进行结构反射的必要性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63244646/

10-11 15:26