2012-10-29 96 views
4

我不是很清楚這個代碼片段的行爲。反射類型和價值在去

func show(i interface{}) { 
    switch t := i.(type) { 
    case *Person: 
     t := reflect.TypeOf(i) //what t contains? 
     v := reflect.ValueOf(i) //what v contains? 
     tag := t.Elem().Field(0).Tag 
     name := v.Elem().Field(0).String() 
    } 
} 

反射類型和值有什麼區別?

回答

6

reflect.TypeOf()返回一個reflect.Typereflect.ValueOf()返回reflect.Value。 A reflect.Type允許您查詢與所有相同類型的變量綁定的信息,而reflect.Value允許您查詢信息並對任意類型的數據執行預操作。

在上面的示例中,您正在使用reflect.Type來獲取Person結構中第一個字段的「標記」。您從*Person的Type開始。要獲取Person的類型信息,您使用了t.Elem()。然後,您使用.Field(0).Tag拉取了有關第一個字段的標籤信息。您傳遞的實際值i並不重要,因爲第一個字段的標記是該類型的一部分。

您使用reflect.Value來獲取值i的第一個字段的字符串表示形式。首先,您使用v.Elem()獲得i指向的結構的值,然後訪問第一個字段的數據(.Field(0)),最後將該數據轉換爲字符串(.String())。

+2

感謝您提供豐富的答案。 – Herks

+1

有關反思的更多詳情,您還應閱讀[反射博客文章的法律](http://blog.golang.org/2011/09/laws-of-reflection.html)。 – nemo