猿问

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

我有结构


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)

}


慕田峪4524236
浏览 152回答 1
1回答

神不在的星期二

因为 type ofchartOpts是*ChartOpts一个指向ChartOpts类型的指针。指针没有字段,只有结构。调用Elem()其类型描述符将返回一个表示 / 描述的类型描述符,ChartOpts这是一个具有字段的结构类型。
随时随地看视频慕课网APP

相关分类

Go
我要回答