反射的規則以下: json
從接口值到反射對象的反射
從反射對象到接口值的反射
爲了修改反射對象,其值必須可設置 函數
---------------------------------------------------------this
reflect包實現了運行時反射,容許程序操做任意類型的對象。典型用法是用靜態類型interface{}保存一個值,經過調用TypeOf獲取其動態類型信息,該函數返回一個Type類型值。調用ValueOf函數返回一個Value類型值,該值表明運行時的數據。Zero接受一個Type類型參數並返回一個表明該類型零值的Value類型值。編碼
範例spa
package main import ( "fmt" "reflect" ) type MyStruct struct { name string } func (this *MyStruct) GetName() string { return this.name } func main() { fmt.Println("--------------") var a MyStruct b := new(MyStruct) fmt.Println(reflect.ValueOf(a)) fmt.Println(reflect.ValueOf(b)) fmt.Println("--------------") a.name = "show" b.name = "show" val := reflect.ValueOf(a).FieldByName("name") //painc: val := reflect.ValueOf(b).FieldByName("name") fmt.Println(val) fmt.Println("--------------") fmt.Println(reflect.ValueOf(a).FieldByName("name").CanSet()) fmt.Println(reflect.ValueOf(&(a.name)).Elem().CanSet()) fmt.Println("--------------") var c string = "show" p := reflect.ValueOf(&c) fmt.Println(p.CanSet()) //false fmt.Println(p.Elem().CanSet()) //true p.Elem().SetString("newName") fmt.Println(c) }
想更好的理解 go 的反射機制,能夠從應用場景入手code
go語言reflect包使用的幾個場景 :xml
1. 遍歷結構體字段名(避免代碼的硬編碼)
2. 調用結構體方法(自動映射)
3. 獲取結構體的tag標記的值(json/xml轉換)對象