首页 > IT职业 > IT生活 > Go(6 [反射])
反射:可以在运行时动态获取变量的相关信息
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 mainimport ( "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()}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2865/viewspace-2817718/ ,如需转载,请注明出处,否则将追究法律责任。