Go - reflection
Go 语言也有反射的机制,通过这种机制可以大大提高程序的灵活性。
reflect包中的 TypeOf 与 ValueOf 方法
首先,当我们想要使用反射技术的时候,我们需要先引用 reflect 包。
import (
"fmt"
"reflect"
)
之后,我们就可以通过reflect包中的TypeOf方法来取到类型,并且使用ValueOf方法来获取字段及方法。我们来看一个实例
// reflect.go
package main import (
"fmt"
"reflect"
) type User struct {
Name string
Age int
Sex string
} func (u User) SayHello() {
fmt.Println("Hello there, I am %s ...", u.Name)
} func main() {
user := User{
"Tony",
,
"male"}
info(user)
} func info(o interface{}) {
t := reflect.TypeOf(o)
fmt.Printf("Type is: %s \n", t.Name()) fmt.Printf("Fields are: \n") // find out fileds
v := reflect.ValueOf(o) for i := ; i < t.NumField(); i++ {
f := t.Field(i)
val := v.Field(i).Interface()
fmt.Printf("%6s: %v=%v\n", f.Name, f.Type, val)
} // find out methods
for i := ; i < t.NumMethod(); i++ {
m := t.Method(i)
fmt.Printf("%6s: %v\n", m.Name, m.Type)
}
}
output:

使用反射修改类型
如果我们需要通过反射的方式来修改类型的字段,那么传入给ValueOf()方法的参数应该是对象的引用。
// reflect1.go
package main import (
"fmt"
"reflect"
) type People struct {
Name string
Age int
} func main() {
p := People{"Tony", }
fmt.Printf("my name is: %s\n", p.Name) val := reflect.ValueOf(&p)
f := val.Elem().FieldByName("Name")
f.SetString("Tom") fmt.Printf("my name is: %s\n", p.Name)
}
使用反射来“动态”调用方法
// reflect1.go
package main import (
"fmt"
"reflect"
) type People struct {
Name string
Age int
} func (p People) Hello(name string) {
fmt.Printf("Hello there, I am %s", name)
} func main() {
p := People{"Tony", }
v := reflect.ValueOf(p)
mv := v.MethodByName("Hello") args := []reflect.Value{reflect.ValueOf("Tom")}
mv.Call(args)
}
需要注意的是,通过反射调用方法的时候需要以slice的形式传入参数,
args := []reflect.Value{reflect.ValueOf("Tom")}
最后使用method.call来调用方法
mv.Call(args)
Go - reflection的更多相关文章
- Fresnel Reflection - 菲涅尔反射
[Fresnel Reflection - 菲涅尔反射] “菲涅尔”是一个人的名字,因为他发现了一个有关反射的光学现象,这个现象就用这个人的名字命名了.那么,是什么现象呢? 这就是反射/折射与视点角度 ...
- CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)
CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection) 2016-08-13 由于CSh ...
- Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag
反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c
错误: Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, V ...
- 代替Reflection(反射)的一些方法
Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...
- Leetcode: Line Reflection
Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...
- 反射(Reflection)
反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明: 示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息 ...
- 异常:“System.Reflection.Metadata”已拥有为“System.Collections.Immutable”定义的依赖项
参考动态执行T4模板:https://msdn.microsoft.com/zh-cn/library/bb126579.aspx 我项目是.NET Framework 4.5控制台应用程序写的. 执 ...
随机推荐
- C++面向对象高级编程(一)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...
- SDP协议简述
SDP协议也是文本协议,只需要按照协议本身的格式填充.SDP协议格式即详细信息如下: 会话描述 格式及举例 v=(protocol version) v=0 o=(owner/creator and ...
- DOM 踩踩踩
1.如果是想给一个DOM元素添加一个伪类,可以转换为 为这个元素添加一个类名,这个类名上面绑定一个伪类. 2.append一个元素,删除掉原来的元素再进行添加.
- iOS TUN之避免UDP包ip分片
iOS的NetworkExtension给应用暴露了一个虚拟网卡TUN设备,可以设置其MTU值.如果上层应用发送的IP包大于这个MTU就会被分片.(详见:http://blog.csdn.net/n5 ...
- Selenium+PhantomJS使用初体验
抓取使用Ajax技术完成的网页内容时可以使用Selenium+PhantomJS技术 1.pip install selenium 2.下载Phantomjs不需要用pip 武汉科技大学首页有一块 ...
- iOS开发CocoaPods使用
一.为什么用CocoaPods iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三 ...
- 华为荣耀8 android 让真机显示 DeBug Log调试信息 (真机调试时不显示 Logcat 日志的解决办法)
================================================================ 以下内容转载自: https://blog.csdn.net/aiko ...
- python文件写中的f.flush()方法
f = open("input.txt", "w") f.write("aaaaaa") f.flush() #强行把缓冲区中的内容放到磁盘 ...
- nginx在使用proxy_pass的情况下开启error_page
error_page用于指定特定错误发生时要显示的url,但是如果请求经proxy_pass处理后,如何使error_page对upstream产生的错误进行处理呢? 方法很简单. 保持之前的erro ...
- CSS琐碎[1]
(1)letter-spacing 设置字符间局,用长度指定(百分比兼容性不好) 没有间距 间距6px API:http://gucong3000.github.io/css-book/propert ...