Вы получаете недопустимое значение, поскольку поле указателя val.b
равно nil
, и вы не можете разыменовать указатель nil
. Если вы хотите, чтобы ваш код работал, вы должны инициализировать его с действительным указателем:
val := reflect.ValueOf(A{b: &B{}})
С этим изменением он работает и выводит данные (попробуйте на Go Playground ) :
struct
ptr
string
Если вы хотите, чтобы он работал без инициализации указателя, вам придется работать с типами , а не с значениями :
val := reflect.ValueOf(A{})
t := val.Type()
for i := 0; i < t.NumField(); i++ {
if ft := t.Field(i).Type; ft.Kind() == reflect.Ptr {
fmt.Println(ft.Elem().Kind())
}
fmt.Println(t.Field(i).Type.Kind())
}
Это выводит то же самое, попробуйте это на Go Детская площадка .