您好,登錄后才能下訂單哦!
反射:可以在運行時動態(tài)獲取變量的相關(guān)信息
reflect.TypeOf,獲取變量的類型,返回reflect.Type類型
reflect.ValueOf,獲取變量的值,返回reflect.Value類型
reflect.Value.Kind,獲取變量的類別,返回一個常量
reflect.Value.Interface(),轉(zhuǎn)換成interface{}類型
修改變量的值
類型檢查代碼
func getTypeInfo(a interface{}) { typeInfo := reflect.TypeOf(a) kind := typeInfo.Kind() fmt.Println("kind of a:", kind) //NumMethod :獲取當(dāng)前變量a 有多少個方法 num := typeInfo.NumMethod() fmt.Println("method num:", num) //MethodByName:通過名字獲取方法的定義 method, ok := typeInfo.MethodByName("SetName") if !ok { fmt.Println("not have method SetName") } else { fmt.Println(method) } fmt.Println() fmt.Println() } func getAllMethod(a interface{}) { typeInfo := reflect.TypeOf(a) //NumMethod:獲取變量實現(xiàn)方法的個數(shù) num := typeInfo.NumMethod() for i := 0;i <num; i++{ method := typeInfo.Method(i) fmt.Println(method) } } func testGetTypeInfo() { var i int getTypeInfo(i) var stu Student getTypeInfo(&stu) var s [5]int getTypeInfo(s) } func testGetAllMethod() { var stu Student getAllMethod(&stu) }
func testGetValuInfo() { var i int = 100 //獲取值相關(guān)信息,返回一個結(jié)構(gòu)體 valueInfo := reflect.ValueOf(&i) //因為修改值,需要傳遞指針,所以呢,使用反射中的 Elem 方法,就是用來修改傳遞指針 valueInfo.Elem().SetInt(200) tmp := valueInfo.Interface() val := tmp.(*int) fmt.Println("val:", val) fmt.Println("val of valueInfo:", valueInfo.Elem().Int()) fmt.Println("type:", valueInfo.Type()) fmt.Println("kind:", valueInfo.Kind()) fmt.Println("i=", i) var stu Student valueInfo = reflect.ValueOf(stu) fmt.Println("type:", valueInfo.Type()) fmt.Println("kind:", valueInfo.Kind()) }
操作結(jié)構(gòu)體
reflect.Value.NumField()獲取結(jié)構(gòu)體中字段的個數(shù)
reflect.Value.Method(n).Call來調(diào)?結(jié)構(gòu)體中的?法
package main import ( "fmt" "reflect" ) type Student struct { Name string Age int Sex int } func (s *Student) Set(name string , Age int, Sex int) { s.Name = name s.Age = Age s.Sex = Sex } func (s *Student) GetName(name string) { s.Name = name } func testStruct () { var stu *Student = &Student{} stu.Set("jim", 18, 1) valueInfo := reflect.ValueOf(stu) fieldNum := valueInfo.Elem().NumField() fmt.Println("field name:", fieldNum) sexValueInfo := valueInfo.Elem().FieldByName("Sex") fmt.Println("sex=", sexValueInfo.Int()) sexValueInfo.SetInt(100) fmt.Println(stu) setMethod := valueInfo.MethodByName("Set") fmt.Println(setMethod) var params []reflect.Value name := "Tom" age := 1000 sex := 3883 params = append(params, reflect.ValueOf(name)) params = append(params, reflect.ValueOf(age)) params = append(params, reflect.ValueOf(sex)) setMethod.Call(params) fmt.Println(stu) } func main() { testStruct() }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。