1. package main;
  2.  
  3. import (
  4. "fmt"
  5. "reflect"
  6. )
  7.  
  8. //反射refection
  9. //反射使用TypeOf和ValueOf函数从接口中获取目标对象信息
  10. //反射会将匿名字段作为独立字段
  11.  
  12. type A struct {
  13. id int;
  14. name string;
  15. age int;
  16. }
  17.  
  18. type B struct {
  19. A
  20. height int;
  21. }
  22.  
  23. type C struct {
  24. Id int;
  25. Name string;
  26. Age int;
  27. }
  28.  
  29. func (a A) Hello() {
  30. fmt.Println("A");
  31. }
  32.  
  33. func (c C) Hello(msg string) {
  34. fmt.Println(msg);
  35. }
  36.  
  37. func info(inf interface{}) {
  38. t := reflect.TypeOf(inf);
  39. fmt.Println(t.Name());
  40. v := reflect.ValueOf(inf);
  41.  
  42. //遍历出结构中的字段名,字段类型和值
  43. for i := 0; i < t.NumField(); i++ {
  44. f := t.Field(i);
  45. val := v.Field(i);
  46. fmt.Println(f.Name, f.Type, val);
  47. }
  48.  
  49. //遍历出方法,注意这里只遍历出公开方法
  50. for i := 0; i < t.NumMethod(); i++ {
  51. m := t.Method(i);
  52. fmt.Println(m.Name, m.Type);
  53. }
  54. }
  55.  
  56. func main() {
  57. a := A{1, "test", 25};
  58. a.Hello();
  59. info(a);
  60. b := B{A: A{id: 2, name: "test2", age: 28}, height: 172};
  61. t := reflect.TypeOf(b);
  62.  
  63. //获得匿名字段信息
  64. fmt.Printf("%#v\n", t.Field(0));
  65. //获得匿名字段结构中的字段
  66. //匿名字段A的索引相对B是0,id相对于A的索引是0
  67. fmt.Printf("%#v\n", t.FieldByIndex([]int{0, 0}));
  68. //name相对于A的索引是1
  69. fmt.Printf("%#v\n", t.FieldByIndex([]int{0, 1}));
  70.  
  71. //通过反射修改变量的值
  72. c := 6;
  73. v := reflect.ValueOf(&c);
  74. v.Elem().SetInt(666);
  75. fmt.Println(c);
  76.  
  77. //通过反射修改结构中的值
  78. d := C{3, "test3", 33};
  79. v2 := reflect.ValueOf(&d);
  80. if v2.Kind() == reflect.Ptr && v2.Elem().CanSet() {
  81. v2 = v2.Elem();
  82. //注意这里只有公开字段才可以设置,不然会报错
  83. v2.FieldByName("Name").SetString("哈哈");
  84. }
  85. fmt.Println(d);
  86.  
  87. //通过反射动态调用方法
  88. e := C{};
  89. e.Hello("e");
  90. v3 := reflect.ValueOf(&e);
  91. m := v3.MethodByName("Hello");
  92. m.Call([]reflect.Value{reflect.ValueOf("eee")});
  93. }

  

go语言中的反射reflect的更多相关文章

  1. Go中的反射reflect

    前面我们在学习到struct结构体的时候,因为结构体中的字段首字母大写,而我们想把json文件映射到该结构体上时,需要在在结构体字段后面加上json标签,表明结构体字段和json字段的映射关系.这其中 ...

  2. golang中的反射reflect详解

    先重复一遍反射三定律: 1.反射可以将"接口类型变量"转换为"反射类型对象". 2.反射可以将"反射类型对象"转换为"接口类型变量 ...

  3. Java中的反射--Reflect

    在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...

  4. Go语言反射reflect

    目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...

  5. go语言之行--接口(interface)、反射(reflect)详解

    一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: ...

  6. 列举java语言中反射的常用方法

    package review;/*12:43 2019/7/21*/ import model.AnotherClass; import model.OneClassMore; import mode ...

  7. Go 中的反射要点

    简介 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 类型以及接口 这个基本概念需要清晰,这里不详细展开. ...

  8. Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  9. Java中的反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

随机推荐

  1. shell命令中用source 和sh(或者bash)执行脚本的区别,以及export的作用

    用户登录到Linux系统后,系统将启动一个用户shell,我们暂且称这个shell为shell父. 在这个shell父中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序. 当使用 ...

  2. 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 ...

  3. RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)

    RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...

  4. 火狐的3d视图插件Tilt 3D

    15年的时候,使用过此功能.后来没注意就发现没了.firefox在47之后就停止自带了. 换成插件了. https://addons.mozilla.org/en-US/firefox/addon/t ...

  5. 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 ...

  6. JAVA 泛型的参数的传递示意图

    泛型的两种参数传递方式

  7. HttpURLConnection 添加代理

    //创建代理服务器 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("www.proxyaddress.com& ...

  8. ADO.Net 数据库增加

    数据库增加数据其实就是把查询语句换成了增加语句,后面执行语句用操作变量点出一个执行方法 cmm.ExecuteNonQuery();//关键语句,执行CommandText,的SQL语句,增删改都用这 ...

  9. String intern 方法 jdk中的描述

    一个初始为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中 ...

  10. mui-当使用addeleventlisener()方法绑定事件时选择器无法绑定事件

    在mui中绑定事件不能用jQuery或mui(“#XX”)的形式选取某个元素,而是document.getelementbyid()的形式 mui(“#XX”)可以使用on方法绑定事件