反射:可以在运行时动态获取变量的相关信息
reflect.TypeOf,获取变量的类型,返回reflect.Type类型
reflect.ValueOf,获取变量的值,返回reflect.Value类型
reflect.Value.Kind,获取变量的类别,返回一个常量
reflect.Value.Interface(),转换成interface{}类型
修改变量的值
类型检查代码
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()) }
操作结构体
reflect.Value.NumField()获取结构体中字段的个数
reflect.Value.Method(n).Call来调⽤结构体中的⽅法
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() }