2017-02-17 20 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

相關問題