2019独角兽企业重金招聘Python工程师标准>>>

反射reflection

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

常用的类型、函数和方法

//返回动态类型i的类型,如果i是一个空结构体类型,TypeOf将返回nil
func TypeOf(i interface{}) Type//Type 接口类型
type Type interface {Align() intFieldAlign() int//指定结构体中方法的下标,返回某个方法的对象,需要注意的是返回的Method是一个独立的结构体Method(int) Method/*type Method struct {Name stringPkgPath stringType TypeFunc ValueIndex int}*/MethodByName(string) (Method, bool)//返回该结构体类型的方法下标NumMethod() int//返回类型的名称,即动态类型i的名称Name() stringPkgPath() stringSize() uintptrString() stringKind() KindImplements(u Type) boolAssignableTo(u Type) boolConvertibleTo(u Type) boolComparable() boolBits() intChanDir() ChanDirIsVariadic() boolElem() Type//返回结构体类型第i个字段Field(i int) StructField//StructField结构体//type StructField struct {// Name string// PkgPath string// Type Type// Tag  StructTag// Offset uintptr// Index []int// Anonymous bool//根据结构体字段索引获取嵌入字段的结构体信息FieldByIndex(index []int) StructFieldFieldByName(name string) (StructField, bool)FieldByNameFunc(match func(string) bool) (StructField, bool)In(i int) TypeKey() TypeLen() int//返回动态类型i(结构体字段)的字段总数NumField() intNumIn() intNumOut() intOut(i int) Type
}//返回接口i的一个初始化的新值.ValueOf(nil)返回一个零值
func ValueOf(i interface{}) Value// Value结构体
type Value struct {}
// Value结构体的一些方法
// 返回结构体v中的第i个字段。如果v的类型不是结构体或者i超出了结构体的范围,则会出现panic
func (v Value) Field(i int) Value//以接口类型返回v的当前值
func (v Value) Interface() (i interface{})
//等价于.
var i interface{} = (v's underlying value)//通过反射方式修改结构体对象的一些方法//返回接口v包含或者指针v包含的值
func (v Value) Elem() Value
//判断该接口v是否可以被set修改
func (v Value) CanSet() bool//使用另外一个反射接口去修改反射值
func (v Value) Set(x Value)
//其他不同类型的Set
func (v Value) SetBool(x bool)
func (v Value) SetBytes(x []byte)
func (v Value) SetFloat(x float64)
func (v Value) SetInt(x int64)
//设置结构体对象v的长度为n
func (v Value) SetLen(n int)
func (v Value) SetString(x string)//一些辅助方法
//返回反射结构体的Value的类型.如果v为零值,IsValid将返回false
func (v Value) Kind() Kind
//判断value是否为有效值,通常用在判断某个字段是否在反射体的Value中
func (v Value) IsValid() bool//Kind常量
type Kind uint
const (Invalid Kind = iotaBoolIntInt8Int16Int32Int64UintUint8Uint16Uint32Uint64UintptrFloat32Float64Complex64Complex128ArrayChanFuncInterfaceMapPtrSliceStringStructUnsafePointer
)

反射的基本操作

通过反射来获取结构体字段的名称以及其他相关信息。

package mainimport ("fmt""reflect"
)//定义结构体
type User struct {Id   intName stringAge  int
}//定义结构体方法
func (u User) Hello() {fmt.Println("Hello xuxuebiao")
}func main() {u := User{1, "bgops", 25}Info(u)u.Hello()
}//定义一个反射函数,参数为任意类型
func Info(o interface{}) {//使用反射类型获取o的Type,一个包含多个方法的interfacet := reflect.TypeOf(o)//打印类型o的名称fmt.Println("type:", t.Name())//使用反射类型获取o的Value,一个空的结构体v := reflect.ValueOf(o)fmt.Println("Fields:")//t.NumField()打印结构体o的字段个数(Id,Name,Age共三个)for i := 0; i < t.NumField(); i++ {//根据结构体的下标i来获取结构体某个字段,并返回一个新的结构体/**type StructField struct {Name stringPkgPath stringType      TypeTag       StructTagOf

转载于:https://my.oschina.net/u/3683692/blog/3039768

golang的reflection(转)(一)相关推荐

  1. linux启停was命令,linux下的启停脚本

    linux下的根据项目名称,进行进程的启停脚本 #!/bin/bash JAVA=/usr/bin/java APP_HOME=/opt/program/qa/wechat APP_NAME=prog ...

  2. Golang反射机制的实现分析——reflect.Type类型名称

    现在越来越多的java.php或者python程序员转向了Golang.其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率.在上述解释型语言中,它们都支持了&quo ...

  3. Golang的反射reflect深入理解和示例

    [TOC] Golang的反射reflect深入理解和示例 [记录于2018年2月] 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机 ...

  4. golang python rpc_grpc - 使用 golang 带你从头撸一套 RPC 服务(一)

    gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多复用请求等特.这些特性使得其在移动设备上表现更好,更省电和节省 ...

  5. golang Receiver has generic name 问题解决

    问题 Golang的方法接收者就是在函数名前的括号内的东西 如 func (self Car) run() // (self car)就是方法接收者 在JetBrains系类的开发工具中(Intell ...

  6. golang语言-1-go普及知识

    Go 语言的官方网站是 golang.org,这个站点采用 Python 作为前端,并且使用 Go 语言自带的工具 godoc 运行在 Google App Engine 上来作为 Web 服务器提供 ...

  7. golang语言编译的二进制可执行文件为什么比 C 语言大(转载)

    最近一位朋友问我"为什么同样的hello world 入门程序"为什么golang编译出来的二进制文件,比 C 大,而且大很多.我做了个测试,来分析这个问题.C 语言的hello ...

  8. Golang面向API编程-interface(接口)

    Golang面向API编程-interface(接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Golang并不是一种典型的面向对象编程(Object Oriented Pr ...

  9. uAdmin the Golang Web framework

    2019独角兽企业重金招聘Python工程师标准>>> A little over two years ago, I started looking for a web framew ...

最新文章

  1. 文件管理服务器主机,通过BlueHost主机文件管理器上传文件
  2. Linux中的火墙策略优化(iptables,firewalld)
  3. 推荐一些实用的的 Python 库
  4. 关于u-boot中的.balignl 16,0xdeadbeef的理解
  5. mysql mvcc机制rc_Mysql中MVCC的使用及原理
  6. 即时通讯视频聊天原理是什么
  7. 鸡汤:干就完了!!!
  8. 虚拟麦克风音频输入_硅麦克风电路连接指南
  9. 阿里云ECS服务器安装AMH5.3面板并搭建WordPress站点详细教程(卞懂的学习笔记)...
  10. JMF的安装与环境的配置
  11. 服务器打不井根目录下的文件,服务器共享文件夹的使用方法.docx
  12. 解决vscode进行chrome调试时报错:localhost拒绝连接请求
  13. IntelliJ IDEA自动添加空行问题
  14. 3.1 Vue实战--电商后台管理系统 的登录功能 补充了 加密功能
  15. iOS中UIControl的介绍
  16. php 七牛时间戳防盗链,时间戳防盗链
  17. java.lang.UnsupportedOperationException解决方法【转】
  18. mac系统M1pro芯片安装VMware Fusion虚拟机win11操作系统(原创详细版)
  19. 【3D建模制作技巧分享】在zbrush中如何雕刻头发 ZBrush头发雕刻小技巧
  20. 区块链技术演进简史:德勤报告解读《区块链技术变革-来自GitHub平台的见解》

热门文章

  1. 使用鸢尾花数据集实现一元逻辑回归、多分类问题
  2. java中intvalue_Java Number intValue()方法与示例
  3. linux下g++和gcc_Linux中gcc和g ++有什么区别?
  4. observable_Java Observable addObserver()方法与示例
  5. 简单的登录系统(java+JFrame+Mysql)
  6. ffmpeg-从mp4、flv、ts文件中提取264视频流数据
  7. 矩阵维度必须一致_如何从看得懂到会使用矩阵思维
  8. 二维map —— HDU1263
  9. 206. 反转链表 golang
  10. linux网路编程之多线程并发服务器