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的反 ...
随机推荐
- cssrefresh.js-CSS文件自动刷新
一.如何使用cssrefresh.js 使用很简单,类似下面的代码: <head> <link rel="stylesheet" type="text/ ...
- Linux CentOS7.5静默安装Oracle11gR2
网上有很多安装教程,但大多不够完整,参照了一些教程,实测安装成功,整理出来分享给大家! 一.官方最低要求配置 内存:1G(官方最低要求1G) 硬盘:40G(企业版安装所需4.29G和1.7G数据文件) ...
- python 列表(二)
列表的其他操作 count 用于统计列表中某个元素出现的次数 Eg: extend 把一个列表添加到另一个列表里面 Index 输出元素的位置即根据内容索引位置 Reverse 把列表元素的位置倒过 ...
- 关于使用mongodb中遇到的时间戳雷同的问题
文不对题,实际上不是时间戳,而是我们使用js取当前毫秒数,将他看为时间戳,每次updata的时候,获取当前毫秒数,把它当做create_time的默认值,自动添加到我们的数据库中,数据模型如下 开始的 ...
- jQuery_计算器实例
知识点: fadeIn()---计算器界面载入淡入效果 hover()---鼠标移入移出某个元素时触发的事件 click()---鼠标单击事件 css()---对元素样式的操作 val()---获取表 ...
- devstck 部署OpenStack Queens allinone
1.环境信息 1台虚拟机 8C16G CentOS 7.2 2.准备工作 #!/bin/bash set -x #配置aliyun的centos和epel mirror mkdir /etc/yu ...
- 概率dp呜呜
概率dp有环怎么办? 答案可劲迭代 ,然后可劲消元 , 怎么消? 我就不知道了. 呵呵
- 搭桥(codevs 1002)
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
- AjaxFileUpload文件上传组件(php+jQuery+ajax)
jQuery插件AjaxFileUpload可以实现ajax文件上传,下载地址:http://www.phpletter.com/contents/ajaxfileupload/ajaxfileupl ...
- Codeforces 651E Table Compression【并查集】
题目链接: http://codeforces.com/problemset/problem/650/C 题意: 给定n*m的矩阵,要求用最小的数表示每个元素,其中各行各列的大小关系保持不变. 分析: ...