反射(Reflection)

反射是利用reflect包实现的

  • 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地
  • 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息
  • 反射会将匿名字段作为独立字段(匿名字段本质)
  • 想要利用反射修改对象状态,前提是interface.data是settable,即pointer-interface
  • 通过反射可以“动态”调用方法

基本操作

package main

import (
"fmt"
"reflect"
) type User struct {
Id int
Name string
Age int
} func (u User) Hello() {
fmt.Println("Hello world!")
}
func Info(o interface{}) {
t := reflect.TypeOf(o) //反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息
fmt.Println("Type:", t.Name()) //调用t.Name方法来获取这个类型的名称 v := reflect.ValueOf(o) //打印出所包含的字段
fmt.Println("Fields:")
for i := 0; i < t.NumField(); i++ { //通过索引来取得它的所有字段,这里通过t.NumField来获取它多拥有的字段数量,同时来决定循环的次数
f := t.Field(i) //通过这个i作为它的索引,从0开始来取得它的字段
val := v.Field(i).Interface() //通过interface方法来取出这个字段所对应的值
fmt.Printf("%6s:%v =%v\n", f.Name, f.Type, val)
}
for i := 0; i < t.NumMethod(); i++ { //这里同样通过t.NumMethod来获取它拥有的方法的数量,来决定循环的次数
m := t.Method(i)
fmt.Printf("%6s:%v\n", m.Name, m.Type) }
}
func main() {
u := User{1, "Jack", 23}
Info(u)
}

动态调用方法

package main

import (
"fmt"
"reflect"
) type User struct {
Id int
Name string
Age int
} func (u User) Hello(name string) {
fmt.Println("Hello", name, "My name is", u.Name)
} func main() {
u := User{1, "OK", 12}
v := reflect.ValueOf(u)
mv := v.MethodByName("Hello")
args := []reflect.Value{reflect.ValueOf("JOE")}
mv.Call(args)
}

最新文章

  1. 通过远程 http API 来控制 lnmp 环境的重启perl脚本
  2. 通过shell命令编辑xml文件--sed工具
  3. JAVA&#160;SSH&#160;框架介绍
  4. 【USB多路电源】layout
  5. 查看.NET Service Pack版本
  6. PHP——字符串统一转码为GBK,自动判断是否UTF8并转码
  7. canvas之----浮动小球
  8. 责任链模式(Chain of Responsibility)
  9. Oracle SQL Developer 免费的DB2客户端
  10. hadoop过程中遇到的错误与解决方法
  11. 列举spark所有算子
  12. 在linux系统上文件传输的小技巧
  13. linux系统 之 curl命令
  14. Django之视图函数总结
  15. 解决find命令报错: paths must precede expression
  16. 我的idea突然没有SVN了是怎么回事
  17. 【必备】史上最全的浏览器 CSS &amp; JS Hack 手册
  18. windows连接远程win服务器失败,win7win10都存在此问题,显示出现身份验证错误,要求的函数不受支持,可能由于CredSSP加密Oracle修正 (原)
  19. [转]Use HandleBars in Express
  20. tomcat 配置文件server.xml 详解 Connector Engine Host Context

热门文章

  1. QT的动画效果 抖动 下坠 透明 最近在开发QT收藏了好多链接
  2. windows中实现有相同的程序运行就不在运行新的程序。
  3. PLSQL使用绑定变量
  4. xtrabackup在线迁移mysql并搭建为主主同步
  5. 【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
  6. easyui学习笔记8—在手风琴中加载其他的页面
  7. Micro
  8. crm动态载入js库
  9. sysctl.conf学习和调优
  10. 汇编试验十四:访问CMOS RAM