2017-02-17 21 views
2

Я пытаюсь использовать отражение, чтобы построить программу, которая будет содержать имя, Вид и тип всех полей в произвольной структуры, которая будет послана в Вот что я получил до сих пор:Как использовать Golang Reflection, чтобы получить тип поля структуры, являющегося срезом? .

type StatusVal int 
type Foo struct { 
    Name string 
    Age int 
} 
type Bar struct { 
    Status StatusVal 
    FSlice []Foo 
} 

func ListFields(a interface{}) { 
    v := reflect.ValueOf(a).Elem() 
    for j := 0; j < v.NumField(); j++ { 
     f := v.Field(j) 
     n := v.Type().Field(j).Name 
     t := f.Type().Name() 
     fmt.Printf("Name: %s Kind: %s Type: %s\n", n, f.Kind(), t) 
    } 
} 

func main() { 
    var x Bar 
    ListFields(&x) 
} 

выход заключается в следующем:

Name: Status Kind: int Type: StatusVal 
Name: FSlice Kind: slice Type: 

Когда поле представляет собой срез, тип пустым. Я попробовал несколько способов, чтобы получить тип данных Срез, но все попытки привели к панике ... обычно это одна:

reflect: call of reflect.Value.Elem on slice Value 

Что нужно сделать, чтобы этот код изменения так, чтобы тип для всех полей, в том числе ломтики, будут перечислены в результатах?

Вот ссылка площадки: https://play.golang.org/p/zpfrYkwvlZ

ответ

2

типа среза приведен в типа буквального как []Foo является типом неназванного, следовательно Type.Name() возвращает пустую строку "".

Использование Type.String() вместо:

t := f.Type().String() 

И тогда выход (попробуйте на Go Playground):

Name: Status Kind: int Type: main.StatusVal 
Name: FSlice Kind: slice Type: []main.Foo 

См родственный вопрос, чтобы узнать больше о типах и их имена: Identify non builtin-types using reflect

+0

Красивый! Спасибо icza! – sman