golang的reflection(转)(一)
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(转)(一)相关推荐
- linux启停was命令,linux下的启停脚本
linux下的根据项目名称,进行进程的启停脚本 #!/bin/bash JAVA=/usr/bin/java APP_HOME=/opt/program/qa/wechat APP_NAME=prog ...
- Golang反射机制的实现分析——reflect.Type类型名称
现在越来越多的java.php或者python程序员转向了Golang.其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率.在上述解释型语言中,它们都支持了&quo ...
- Golang的反射reflect深入理解和示例
[TOC] Golang的反射reflect深入理解和示例 [记录于2018年2月] 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机 ...
- golang python rpc_grpc - 使用 golang 带你从头撸一套 RPC 服务(一)
gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多复用请求等特.这些特性使得其在移动设备上表现更好,更省电和节省 ...
- golang Receiver has generic name 问题解决
问题 Golang的方法接收者就是在函数名前的括号内的东西 如 func (self Car) run() // (self car)就是方法接收者 在JetBrains系类的开发工具中(Intell ...
- golang语言-1-go普及知识
Go 语言的官方网站是 golang.org,这个站点采用 Python 作为前端,并且使用 Go 语言自带的工具 godoc 运行在 Google App Engine 上来作为 Web 服务器提供 ...
- golang语言编译的二进制可执行文件为什么比 C 语言大(转载)
最近一位朋友问我"为什么同样的hello world 入门程序"为什么golang编译出来的二进制文件,比 C 大,而且大很多.我做了个测试,来分析这个问题.C 语言的hello ...
- Golang面向API编程-interface(接口)
Golang面向API编程-interface(接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Golang并不是一种典型的面向对象编程(Object Oriented Pr ...
- uAdmin the Golang Web framework
2019独角兽企业重金招聘Python工程师标准>>> A little over two years ago, I started looking for a web framew ...
最新文章
- 文件管理服务器主机,通过BlueHost主机文件管理器上传文件
- Linux中的火墙策略优化(iptables,firewalld)
- 推荐一些实用的的 Python 库
- 关于u-boot中的.balignl 16,0xdeadbeef的理解
- mysql mvcc机制rc_Mysql中MVCC的使用及原理
- 即时通讯视频聊天原理是什么
- 鸡汤:干就完了!!!
- 虚拟麦克风音频输入_硅麦克风电路连接指南
- 阿里云ECS服务器安装AMH5.3面板并搭建WordPress站点详细教程(卞懂的学习笔记)...
- JMF的安装与环境的配置
- 服务器打不井根目录下的文件,服务器共享文件夹的使用方法.docx
- 解决vscode进行chrome调试时报错:localhost拒绝连接请求
- IntelliJ IDEA自动添加空行问题
- 3.1 Vue实战--电商后台管理系统 的登录功能 补充了 加密功能
- iOS中UIControl的介绍
- php 七牛时间戳防盗链,时间戳防盗链
- java.lang.UnsupportedOperationException解决方法【转】
- mac系统M1pro芯片安装VMware Fusion虚拟机win11操作系统(原创详细版)
- 【3D建模制作技巧分享】在zbrush中如何雕刻头发 ZBrush头发雕刻小技巧
- 区块链技术演进简史:德勤报告解读《区块链技术变革-来自GitHub平台的见解》
热门文章
- 使用鸢尾花数据集实现一元逻辑回归、多分类问题
- java中intvalue_Java Number intValue()方法与示例
- linux下g++和gcc_Linux中gcc和g ++有什么区别?
- observable_Java Observable addObserver()方法与示例
- 简单的登录系统(java+JFrame+Mysql)
- ffmpeg-从mp4、flv、ts文件中提取264视频流数据
- 矩阵维度必须一致_如何从看得懂到会使用矩阵思维
- 二维map —— HDU1263
- 206. 反转链表 golang
- linux网路编程之多线程并发服务器