反射:能夠在運行時動態獲取變量的相關信息
app
reflect.TypeOf,獲取變量的類型,返回reflect.Type類型
reflect.ValueOf,獲取變量的值,返回reflect.Value類型
reflect.Value.Kind,獲取變量的類別,返回一個常量ide
reflect.Value.Interface(),轉換成interface{}類型
spa
修改變量的值指針
類型檢查代碼
get
func getTypeInfo(a interface{}) { typeInfo := reflect.TypeOf(a) kind := typeInfo.Kind() fmt.Println("kind of a:", kind) //NumMethod :獲取當前變量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:獲取變量實現方法的個數 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 //獲取值相關信息,返回一個結構體 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()) }
操做結構體
string
reflect.Value.NumField()獲取結構體中字段的個數it
reflect.Value.Method(n).Call來調⽤結構體中的⽅法
io
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() }