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的更多相关文章

  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. java.util.Arrays$ArrayList addAll报错

    执行下面代码时报错: List<String> centerList = WebConstants.SUPPORT_BIG_CENTERS_LIST; // WebConstants.SU ...

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

    泛型的两种参数传递方式

  3. 多线程数据库查询(ADO)

    ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用(CoInitialize was not called):所以,在使用任何dbGo对象前,必须手 调用CoIniti ...

  4. 吴裕雄 28-MySQL 序列使用

    MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现 使用AUTO_INCREMENTMySQ ...

  5. oracle创建数据库步骤

    1.oracle安装成功后, cmd sqlplus,然后system/orcl as sysdba 2.更改scott的密码,scott的默认密码是tiger SQL> alter user ...

  6. ASP.NET 简介

    简介:ASP.NET - 制作网站应用程序的技术1.  WebForm 2.  MVC 什么东西? winform 界面 - 后台 - 数据库 共同组合出来的程序:ASP.NET 界面(HTML+CS ...

  7. JS-cookie和正则表达式

    一 cookie 1 什么是cookie? 会话跟踪技术 2 作用 验证身份,存储信息. 3 特点 大小限制,最多存4k: 每个域下只能存50个cookie: 有时间限制: 只能存放字符串: 只能访问 ...

  8. Spark Streaming之五:Window窗体相关操作

    SparkStreaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据,会被聚 ...

  9. ubuntu下搭建node server的几个坑

    [ubuntu下搭建node server的几个坑] 1.环境变量 process.env.PORT需要使用 export PORT=80设置 windows下是set PORT=80 2.命令连结 ...

  10. c# 项目的导入

    1.打开 2.手动添加现有项目,对照后找到未添加的空间,然后打开底层  选择 “#”文件打开即可 3.每个空间分别添加隐藏项  注意 bin与obj不需要添加 4.添加引用 5.可能需要删除   li ...