отражение: вызов рефлекса. Значение.FieldByName в значении ptr - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть структура данных, подобная этой демонстрации.

type Family struct {
   first string
   last string
}
type Person struct {
   name string
   family *Family
}

func main(){
   per1 := Person{name:"niki",family:&Familys{first:"yam",last:"bari"}}
   Check(per1)
}

и код:

var validate *validator.Validate
func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        v = v.FieldByName("family").FieldByName("last")
        fmt.Println(v)
    }
}

когда я не использую точку для Family, она возвращает "bari", и это нормально. Но с точкой, есть эта ошибка.

отражение: вызов рефлекса. Значение.FieldByName в ptr Значение

Я много искал, но не могу найти ответ, может помочь.

1 Ответ

0 голосов
/ 30 апреля 2018

Как вы уже заметили, family - это *Family. И, как говорится в ошибке, вы не можете вызвать .FieldByName(...) на reflect.Value, где это значение является указателем.

Вместо этого вам нужно косвенно указать указатель, чтобы получить значение, на которое он указывает, и вызвать .FieldByName(...) для этого.

familyPtr := v.FieldByName("family")
v = reflect.Indirect(familyPtr).FieldByName("last")

См. Документы по косвенным вопросам: https://golang.org/pkg/reflect/#Indirect

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