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. android实战简易教程-链接

    http://blog.csdn.net/yayun0516/article/category/2799943

  2. scrollfix.js插件:滚动固定在某个位置

    插件文件在/文件 scrollfix.js 用法: var fix = $(".fix"), fixtop = $(".fix-top"), fixStartT ...

  3. 笔试算法题(16):二叉树深度计算 & 字符串全排列

    出题:要求判断二元树的深度(最长根节点到叶节点的路径): 分析:二元递归不容易使用循环实现 解题: struct Node { int value; Node *left; Node *right; ...

  4. 标量子查询中有ROWNUM=1怎么改?

    碰到标量子查询中有ROWNUM=1怎么改? select to_date(o.postdate,'yyyymmdd'), (select cur.c_code from cur_tbl cur whe ...

  5. linux netstat-查看Linux中网络系统状态信息

    博主推荐:更多网络测试相关命令关注 网络测试  收藏linux命令大全 netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况. 语法 netstat(选项) ...

  6. laravel框架应用和composer扩展包开发

    laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,laravel框架思想前卫,跟随时代潮 ...

  7. 91-Williams' Percent Range 威廉指标.(2015.7.4)

    Williams' Percent Range 威廉指标 ~计算: %R = (HIGH(i-n)-CLOSE)/(HIGH(i-n)-LOW(i-n))×100 注解:CLOSE: 当前时段的收盘价 ...

  8. python Django 相关学习笔记

    Django框架 pip3 install django 命令: # 创建Django程序 django-admin startproject mysite # 进入程序目录 cd mysite # ...

  9. LeetCode(70) Climbing Stairs

    题目 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cli ...

  10. NormalMap 法线贴图

    法线贴图+纹理贴图(细节明显) 纹理贴图 法线贴图 法线贴图 存储法线的一张贴图,归一化的法线的 xyz 的值被映射成为对应的 RGB 值.归一化的法线值为[-1,1],RGB的每一个分量为无符号的8 ...