go13---反射reflection
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的更多相关文章
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- [整理]C#反射(Reflection)详解
本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...
- CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)
CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...
- 代理(Proxy)和反射(Reflection)
前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...
- Golang 反射reflection
反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...
- C# 反射(Reflection)技术
本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点 .Net应用程序是由程序集(Assembly).模块(Module).类型 ...
- C#反射(Reflection)详解
1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...
- C# 反射Reflection——反射反射程序员的快乐
一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...
- Laravel学习笔记之PHP反射(Reflection) (上)
Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读 · 读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...
随机推荐
- JavaScript异步编程解决方案探究
javascript的天生单线程特性,使得异步编程对它异常重要,早期的通常做法是用回调函数来解决.但是随着逻辑的复杂,和javascript在服务端的大显神通,使得我们很容易就陷入“回调陷井”的万丈深 ...
- mysql 存储过程批量删除重复数据
表结构: LOAD DATA INFILE '/usr/local/phone_imsi_12' replace INTO TABLE tbl_imsi2number_new FIELDS TERMI ...
- Python:os模块 time模块
1.os os.popen('cmd').read() 执行某个系统命令,:输出命令结果 os.getcwd() 获取当前操作目录 os.makedirs(r"C:\a\b\c" ...
- Nginx的初识
今日刚接触了解到Nginx的反向代理,正向代理,并发,集群,同个站点不同域名的解析访问等等. 1.反向代理:Nginx充当一个桥接的作用,对用户和服务端进行链接,进行服务端的代理,这样有什么好处: a ...
- json pickle shelve hashlib collections time
import json # Json模块提供了四个功能:dumps.dump.loads.load dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = js ...
- 添物不花钱学javaEE--CSS
CSS是什么? CSS: Cascading Style Sheets CSS官方网址: https://www.w3.org/TR/2011/REC-CSS2-20110607/ 其实仔细研究这个就 ...
- [luoguP1077] 摆花(DP)
传送门 f[i][j] 表示前 i 种花,摆 j 盆的方案数 j f[i][j] = Σ f[i - 1][j] k=max(0, j - a[i]) 博客园这个公式该怎么打啊.. ——代码( ...
- noip模拟赛 写代码
分析:这其实就是括号匹配题,一眼贪心题,不过一开始贪错了,以为([)]是合法的......其实括号之间不能嵌套. 一开始的想法是尽量往左边填左括号,因为每种括号的数量都确定了,那么左括号和右括号的数量 ...
- 【扫描线】HDU 5124 lines
http://acm.hdu.edu.cn/showproblem.php?pid=5124 [题意] 在数轴x上,每次操作都覆盖一个区间的所有点,问被覆盖次数最多的点是覆盖了多少次 [思路] 最简单 ...
- fzu 2113 数位dp
#include<stdio.h> #include<string.h> #define N 20 #define ll __int64 ll dp[N][N];//最多记忆4 ...