go语言中的反射reflect
- package main;
- import (
- "fmt"
- "reflect"
- )
- //反射refection
- //反射使用TypeOf和ValueOf函数从接口中获取目标对象信息
- //反射会将匿名字段作为独立字段
- type A struct {
- id int;
- name string;
- age int;
- }
- type B struct {
- A
- height int;
- }
- type C struct {
- Id int;
- Name string;
- Age int;
- }
- func (a A) Hello() {
- fmt.Println("A");
- }
- func (c C) Hello(msg string) {
- fmt.Println(msg);
- }
- func info(inf interface{}) {
- t := reflect.TypeOf(inf);
- fmt.Println(t.Name());
- v := reflect.ValueOf(inf);
- //遍历出结构中的字段名,字段类型和值
- for i := 0; i < t.NumField(); i++ {
- f := t.Field(i);
- val := v.Field(i);
- fmt.Println(f.Name, f.Type, val);
- }
- //遍历出方法,注意这里只遍历出公开方法
- for i := 0; i < t.NumMethod(); i++ {
- m := t.Method(i);
- fmt.Println(m.Name, m.Type);
- }
- }
- func main() {
- a := A{1, "test", 25};
- a.Hello();
- info(a);
- b := B{A: A{id: 2, name: "test2", age: 28}, height: 172};
- t := reflect.TypeOf(b);
- //获得匿名字段信息
- fmt.Printf("%#v\n", t.Field(0));
- //获得匿名字段结构中的字段
- //匿名字段A的索引相对B是0,id相对于A的索引是0
- fmt.Printf("%#v\n", t.FieldByIndex([]int{0, 0}));
- //name相对于A的索引是1
- fmt.Printf("%#v\n", t.FieldByIndex([]int{0, 1}));
- //通过反射修改变量的值
- c := 6;
- v := reflect.ValueOf(&c);
- v.Elem().SetInt(666);
- fmt.Println(c);
- //通过反射修改结构中的值
- d := C{3, "test3", 33};
- v2 := reflect.ValueOf(&d);
- if v2.Kind() == reflect.Ptr && v2.Elem().CanSet() {
- v2 = v2.Elem();
- //注意这里只有公开字段才可以设置,不然会报错
- v2.FieldByName("Name").SetString("哈哈");
- }
- fmt.Println(d);
- //通过反射动态调用方法
- e := C{};
- e.Hello("e");
- v3 := reflect.ValueOf(&e);
- m := v3.MethodByName("Hello");
- m.Call([]reflect.Value{reflect.ValueOf("eee")});
- }
go语言中的反射reflect的更多相关文章
- Go中的反射reflect
前面我们在学习到struct结构体的时候,因为结构体中的字段首字母大写,而我们想把json文件映射到该结构体上时,需要在在结构体字段后面加上json标签,表明结构体字段和json字段的映射关系.这其中 ...
- golang中的反射reflect详解
先重复一遍反射三定律: 1.反射可以将"接口类型变量"转换为"反射类型对象". 2.反射可以将"反射类型对象"转换为"接口类型变量 ...
- Java中的反射--Reflect
在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...
- Go语言反射reflect
目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...
- go语言之行--接口(interface)、反射(reflect)详解
一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: ...
- 列举java语言中反射的常用方法
package review;/*12:43 2019/7/21*/ import model.AnotherClass; import model.OneClassMore; import mode ...
- Go 中的反射要点
简介 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 类型以及接口 这个基本概念需要清晰,这里不详细展开. ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Java中的反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
随机推荐
- shell命令中用source 和sh(或者bash)执行脚本的区别,以及export的作用
用户登录到Linux系统后,系统将启动一个用户shell,我们暂且称这个shell为shell父. 在这个shell父中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序. 当使用 ...
- How to Pronounce T + Dark L
How to Pronounce T + Dark L Share Tweet Share Tagged With: Dark L The T and Dark L combination is co ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
- 火狐的3d视图插件Tilt 3D
15年的时候,使用过此功能.后来没注意就发现没了.firefox在47之后就停止自带了. 换成插件了. https://addons.mozilla.org/en-US/firefox/addon/t ...
- Android对接WebService -- The given SOAPAction http://webservice.ams.cnpc.com/getServerTime does not match an operation.
问题描述:Chrome Restlet下模拟请求出现如下问题 The given SOAPAction http://webservice.ams.cnpc.com/getServerTime doe ...
- JAVA 泛型的参数的传递示意图
泛型的两种参数传递方式
- HttpURLConnection 添加代理
//创建代理服务器 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("www.proxyaddress.com& ...
- ADO.Net 数据库增加
数据库增加数据其实就是把查询语句换成了增加语句,后面执行语句用操作变量点出一个执行方法 cmm.ExecuteNonQuery();//关键语句,执行CommandText,的SQL语句,增删改都用这 ...
- String intern 方法 jdk中的描述
一个初始为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中 ...
- mui-当使用addeleventlisener()方法绑定事件时选择器无法绑定事件
在mui中绑定事件不能用jQuery或mui(“#XX”)的形式选取某个元素,而是document.getelementbyid()的形式 mui(“#XX”)可以使用on方法绑定事件