go语言中的反射reflect

摘要:
packagemain;import//反射refection//反射使用TypeOf和ValueOf函数从接口中获取目标对象信息//反射会将匿名字段作为独立字段typeAstruct{idint;namestring;ageint;}typeBstruct{Aheightint;}typeCstruct{Idint;Namestring;Ageint;}funcHello(){fmt.Println("A");}funcHello{fmt.Println;}funcinfo{t:=reflect.TypeOf;fmt.Println;v:=reflect.ValueOf;//遍历出结构中的字段名,字段类型和值fori:=0;i˂t.NumField();i++{f:=t.Field;val:=v.Field;fmt.Println;}//遍历出方法,注意这里只遍历出公开方法fori:=0;i˂t.NumMethod();i++{m:=t.Method;fmt.Println;}}funcmain(){a:=A{1,"test",25};a.Hello();info;b:=B{A:A{id:2,name:"test2",age:28},height:172};t:=reflect.TypeOf;//获得匿名字段信息fmt.Printf;//获得匿名字段结构中的字段//匿名字段A的索引相对B是0,id相对于A的索引是0fmt.Printf;//name相对于A的索引是1fmt.Printf;//通过反射修改变量的值c:=6;v:=reflect.ValueOf(&c);v.Elem().SetInt;fmt.Println;//通过反射修改结构中的值d:=C{3,"test3",33};v2:=reflect.ValueOf(&d);ifv2.Kind()==reflect.Ptr&&v2.Elem().CanSet(){v2=v2.Elem();//注意这里只有公开字段才可以设置,不然会报错v2.FieldByName.SetString;}fmt.Println;//通过反射动态调用方法e:=C{};e.Hello("e");v3:=reflect.ValueOf(&e);m:=v3.MethodByName;m.Call;}
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
", t.Field(0));
	//获得匿名字段结构中的字段
	//匿名字段A的索引相对B是0,id相对于A的索引是0
	fmt.Printf("%#v
", t.FieldByIndex([]int{0, 0}));
	//name相对于A的索引是1
	fmt.Printf("%#v
", 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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转:高并发场景下强一致预算/库存扣减方案C#(99):加密与解密 Sytem.Security.CryptoGraphy下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

PS如何把印章颜色加重更加清晰?

我的问题是加深这个印章上的红色,然后看起来更清晰,而不会影响最下面一行文字的颜色。步骤1:打开PS软件并创建新文档。白边的实际密封尺寸设置为5cm,分辨率设置为72像素/英寸。在本例中,图像更清晰;步骤2:在工具栏中选择椭圆工具。注意图中的红色圆圈2。确保选择图形层而不是路径。...

将txt、csv等文本文件导入Hive

将txt、csv等文本文件导入Hive目录将txt、csv等文本文件导入Hive00.数据在虚拟机外01.启动hadoop、hdfs02.将文件放置在hdfs目录下03.登录hive并进入指定数据库04.根据文件创建表05.执行导入语句00.数据在虚拟机外如果数据在虚拟机内,请跳过此步,直接执行接下来的操作。...

浅谈JEECG多数据源的使用

首先,我们将简要介绍JEECG是什么。JEECG主张简单的功能由代码生成器直接生成,复杂的业务由表单定制,业务流程由工作流实现和扩展,开发人员编写特殊的业务逻辑。让我们重点讨论JEECG3.5GA中多个数据源的使用。JEECG3.5提供多个数据源的功能。JEECG多数据源的设计直接使用Springjdbc连接,独立于Hibernate、Mybatis和其他持...

文件(夹)对比利器WinMerge

IDE中自带的svn功能较弱,还好有winMerge弥补了它的缺陷,它可以对比文件、文件夹,使用起来还是较为方便,界面也是中文。“开始”菜单,弹出对话框中选择需要进行对比的文件夹或文件然后选择一个过滤器,它自带就可以过滤掉svn目录,如需要过滤其它一些指定的目录,则需要自己修改过滤器的规则了,也很简单。...

The server selected protocol version TLS10 is not accepted by client preferences [TLS12]

修改jre中的这个文件:/java/jdk1.8/jre/lib/security/java.securityjdk.tls.legacyAlgorithms直接改成下面的这个:jdk.tls.legacyAlgorithms=SSLv3,RC4,DES,MD5withRSA,DHkeySize˂1024,ECkeySize˂224,anon,NULL,in...

Linux下如何确认磁盘是否为SSD

方法1:通过cat/sys/block/sda/queue/rotative查看/sys/block/sda/queet/rotative,返回值0为SSD;返回1表示HDD。方法2:通过lsscsi[root@ssd-testthatsit]#cat/sys/bl...