反射:可以在运行时动态获取变量的相关信息
创新互联长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为秦淮企业提供专业的成都网站设计、网站建设,秦淮网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。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 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() }创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
当前名称:Go(6[反射])-创新互联
网页路径:http://cdweb.net/article/dcdjge.html