Необходимость вызова метода Elem () на указателе-приемнике для отражения структуры - PullRequest
0 голосов
/ 04 августа 2020

У меня есть структура

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)
}

1 Ответ

1 голос
/ 04 августа 2020

Поскольку тип chartOpts равен *ChartOpts, это указатель на тип ChartOpts. У указателей нет полей, только структуры. Вызов Elem() для его дескриптора типа вернет дескриптор типа, который представляет / описывает ChartOpts, тип структуры, который имеет поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...