package main

/**
反射reflection 反射可大大提高程序的灵活性,使得 interface{} 有更大的发挥余地
反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息
反射会将匿名字段作为独立字段(匿名字段本质)
想要利用反射修改对象状态,前提是 interface.data 是 settable,
即 pointer-interface
- 通过反射可以“动态”调用方法 */
import (
"fmt"
"reflect"
) type User struct {
Id int
Name string
Age int
} type Manager struct {
User //嵌入字段是User
title string
} func (u User) Hello() { //为结构体增加方法
fmt.Println("hello wloid")
} func (u User) Hellooo(name string) { //为结构体增加方法
fmt.Println("hello ", name, "my name id ", u.Name)
} func main() {
u := User{, "US", }
Info(u) //反射取出匿名字段//反射匿名、嵌入字段
m := Manager{User: User{, "oj", }, title: "title"}
t := reflect.TypeOf(m)
fmt.Println(t) //m的类型,main.Manager
fmt.Println("%v", t.Field()) //取manager中索引为0的字段User,{User main.User 0 [0] true}
fmt.Println("%v", t.Field()) //取manager中索引为1的字段title,{title main string 32 [1] false}
fmt.Println("%v", t.FieldByIndex([]int{, })) //取出User里面的id,[]int{0, 0}是一个int类型的slice,
//第一个0表示User是Manager的第一个,第二个0表示id是User的第一个,{Id int 0 [0] false}
fmt.Println("%v", t.FieldByIndex([]int{, })) //{Age int 24 [2] false} x :=
v := reflect.ValueOf(&x)
fmt.Println(v) //0xc042048158
v.Elem().SetInt()
fmt.Println(x) //9 //接口中的对象通过反射对值进行修改
w := User{, "u2", }
Set(&w)
fmt.Println(w) //{2 bubaibai 22} //通过反射调用方法
y := User{, "u3", }
v = reflect.ValueOf(y) //通过反射得到对象本身 mv := v.MethodByName("Hellooo") //得到Hellooo方法
args := []reflect.Value{reflect.ValueOf("hhh000")} //参数
mv.Call(args) //调用方法,hello hhh000 my name id u3 } //接口中的对象通过反射对值进行修改
func Set(o interface{}) {
v := reflect.ValueOf(o) //得到值,就是通过反射得到的值本身,
fmt.Println("V------------V===", v) //&{2 u2 22} //判断是不是point interface,因为要调用Elem方法取得实际的对象
if v.Kind() == reflect.Ptr && !v.Elem().CanSet() { //CanSet表示能够修改
fmt.Println("不能修改")
return
} else {
v = v.Elem()
} if f := v.FieldByName("Name"); f.Kind() == reflect.String { //这里是string,就是reflect.String就调用SetString,
f.SetString("bubaibai")
}
} //反射已知字段
func Info(i interface{}) { //打印穿进去接口的信息
t := reflect.TypeOf(i)
fmt.Println("Type: ", t.Name()) //类型,Type: User v := reflect.ValueOf(i) for i := ; i < t.NumField(); i++ { //NumField是字段数量
f := t.Field(i) //字段
val := v.Field(i).Interface() //字段所对应的值
fmt.Println("字段:", f.Name, f.Type, val) //字段的名称,类型,值:Id int 1,Name string US,Age int 12
} for i := ; i < t.NumMethod(); i++ {
m := t.Method(i)
fmt.Println("方法:", m.Name, m.Type) //Hello func(main.User)
}
}

go13---反射reflection的更多相关文章

  1. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  2. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  3. [整理]C#反射(Reflection)详解

    本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...

  4. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

  5. 代理(Proxy)和反射(Reflection)

    前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...

  6. Golang 反射reflection

    反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...

  7. C# 反射(Reflection)技术

    本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点         .Net应用程序是由程序集(Assembly).模块(Module).类型 ...

  8. C#反射(Reflection)详解

    1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...

  9. C# 反射Reflection——反射反射程序员的快乐

    一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...

  10. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

随机推荐

  1. LeetCode136,137寻找只出现一次的数

    1.题目意思:在数组中,只有一个数字只出现了一次 其他的都出现了两次.找出那个只出现一次的数字. //利用位运算 异或 两个相同的数字异或为0 public int singleNumber(int[ ...

  2. python 3 廖雪峰博客笔记(三) 命令行模式与交互模式

    python 的代码一般保存为 .py结尾的文本文件格式 比如 add.py 里写下如下内容 100 + 200 执行 add.py有两种方式: 1. 命令行方式:将python代码写入脚本中执行 p ...

  3. Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?

    目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音 ...

  4. centos6 rpm安装mysql(5.5版本)包括 error : Failed dependencies:libaio的解决办法.

    1.先在/opt目录下放了两个rpm包 2.先看系统中是否有其他版本的mysql的rpm包 rpm -qa | grep -i mysql 命令结果如下图: 如果没有此步跳过,否则执行一下命令将其删除 ...

  5. Centos7配置ThinkPHP5.0完整过程(一)

    在Centos中配置PHP服务器环境,首先要安装Apache的http服务,然后安装php解析环境,最后再配置ThinkPHP5.0. 首先安装HTTP sudo yum install httpd ...

  6. Python自动化测试-使用Pandas来高效处理测试数据

    一.思考 1.Pandas是什么? 功能极其强大的数据分析库 可以高效地操作各种数据集 csv格式的文件 Excel文件 HTML文件 XML格式的文件 JSON格式的文件 数据库操作 2.经典面试题 ...

  7. POJ-1679 The Unique MST,次小生成树模板题

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K       Description Given a connected undirec ...

  8. bzoj3262 陌上花开 cdq+树状数组

    [bzoj3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...

  9. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组

    1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组   #include <iostream> #include <string> #include & ...

  10. csu1365 Play with Chain

    很显然的splay,第一次用splay操作区间...我实在佩服这个targan大佬,居然搞出这么牛逼的平衡树,调了大概5个小时终于搞定了.. #include<cstdio> #inclu ...