Go(6 [反射])
反射:可以在运行时动态获取变量的相关信息
reflect.TypeOf,获取变量的类型,返回reflect.Type类型
reflect.ValueOf,获取变量的值,返回reflect.Value类型
reflect.Value.Kind,获取变量的类别,返回一个常量
reflect.Value.Interface(),转换成interface{}类型
修改变量的值
类型检查代码
funcgetTypeInfo(ainterface{}){typeInfo:=reflect.TypeOf(a)kind:=typeInfo.Kind()fmt.Println("kindofa:",kind)//NumMethod:获取当前变量a有多少个方法num:=typeInfo.NumMethod()fmt.Println("methodnum:",num)//MethodByName:通过名字获取方法的定义method,ok:=typeInfo.MethodByName("SetName")if!ok{fmt.Println("nothavemethodSetName")}else{fmt.Println(method)}fmt.Println()fmt.Println()}funcgetAllMethod(ainterface{}){typeInfo:=reflect.TypeOf(a)//NumMethod:获取变量实现方法的个数num:=typeInfo.NumMethod()fori:=0;i<num;i++{method:=typeInfo.Method(i)fmt.Println(method)}}functestGetTypeInfo(){variintgetTypeInfo(i)varstuStudentgetTypeInfo(&stu)vars[5]intgetTypeInfo(s)}functestGetAllMethod(){varstuStudentgetAllMethod(&stu)}
functestGetValuInfo(){variint=100//获取值相关信息,返回一个结构体valueInfo:=reflect.ValueOf(&i)//因为修改值,需要传递指针,所以呢,使用反射中的Elem方法,就是用来修改传递指针valueInfo.Elem().SetInt(200)tmp:=valueInfo.Interface()val:=tmp.(*int)fmt.Println("val:",val)fmt.Println("valofvalueInfo:",valueInfo.Elem().Int())fmt.Println("type:",valueInfo.Type())fmt.Println("kind:",valueInfo.Kind())fmt.Println("i=",i)varstuStudentvalueInfo=reflect.ValueOf(stu)fmt.Println("type:",valueInfo.Type())fmt.Println("kind:",valueInfo.Kind())}
操作结构体
reflect.Value.NumField()获取结构体中字段的个数
reflect.Value.Method(n).Call来调⽤结构体中的⽅法
packagemainimport("fmt""reflect")typeStudentstruct{NamestringAgeintSexint}func(s*Student)Set(namestring,Ageint,Sexint){s.Name=names.Age=Ages.Sex=Sex}func(s*Student)GetName(namestring){s.Name=name}functestStruct(){varstu*Student=&Student{}stu.Set("jim",18,1)valueInfo:=reflect.ValueOf(stu)fieldNum:=valueInfo.Elem().NumField()fmt.Println("fieldname:",fieldNum)sexValueInfo:=valueInfo.Elem().FieldByName("Sex")fmt.Println("sex=",sexValueInfo.Int())sexValueInfo.SetInt(100)fmt.Println(stu)setMethod:=valueInfo.MethodByName("Set")fmt.Println(setMethod)varparams[]reflect.Valuename:="Tom"age:=1000sex:=3883params=append(params,reflect.ValueOf(name))params=append(params,reflect.ValueOf(age))params=append(params,reflect.ValueOf(sex))setMethod.Call(params)fmt.Println(stu)}funcmain(){testStruct()}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。