2017-02-17 11 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: 

フィールドはスライスである場合、型はブランクです。私は、スライスのデータ型を取得するにはいくつかの方法を試してみましたが、すべての試みはパニックになった...通常、この1:

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

すべてのフィールドの種類ように、このコードに行われる必要がどのような変更を含みますスライスは、出力に表示されますか?ここ

は、遊び場のリンクの:[]Fooようリテラルタイプで与えhttps://play.golang.org/p/zpfrYkwvlZ

答えて

2

スライスタイプは、空の文字列を返す""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

関連する問題