Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 在指针接收器上调用Elem()方法进行结构反射的必要性_Pointers_Go_Struct_Reflection - Fatal编程技术网

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
的类型描述符,该结构类型没有字段