我有结构
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/