Pointers 在指针接收器上调用Elem()方法进行结构反射的必要性
我有一个结构Pointers 在指针接收器上调用Elem()方法进行结构反射的必要性,pointers,go,struct,reflection,Pointers,Go,Struct,Reflection,我有一个结构 type ChartOpts struct { Name mypakage.MyType Repo mypakage.MyType } 我想在上面设置一个接收器进行反射 func (chartOpts *ChartOpts) BindFlags() { fields := reflect.TypeOf(chartOpts) values := reflect.ValueOf(chartOpts)
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
的类型描述符,该结构类型没有字段