golang reflect包使用解析
golang reflect包使用解析
参考
2个重要的类型
- Type
- Value
其中Type是interface类型,Value是struct类型,意识到这一点很重要
Type和Value拥有的同名方法
Type | Value | 备注 |
---|---|---|
Kind | Kind | 返回指定对象的Kind类型 |
MethodByName | MethodByName | 根据方法名找方法 |
Method | Method | 返回第i个方法 |
NumMethod | NumMethod | 返回拥有的方法总数,包括unexported方法 |
Field | Field | 取struct结构的第n个field |
FieldByIndex | FieldByIndex | 嵌套的方式取struct的field,比如v.FieldByIndex(1,2,3)等价于 v.field(1).field(2).field(3) |
FieldByNameFunc | FieldByNameFunc | 返回名称匹配match函数的field |
NumField | NumField | 返回struct所包含的field数量 |
Type独有的方法
方法名 | 备注 |
---|---|
Align | 分配内存时的内存对齐字节数 |
FieldAlign | 作为struct的field时内存对齐字节数 |
Name | type名 string类型 |
PkgPath | 包路径, "encoding/base64", 内置类型返回empty string |
Size | 该类型变量占用字节数 |
String | type的string表示方式 |
Implements | 判断该类型是否实现了某个接口 |
AssignableTo | 判断该类型能否赋值给某个类型 |
ConvertibleTo | 判断该类型能否转换为另外一种类型 |
Comparable | 判断该类型变量是否可以比较 |
ChanDir | 返回channel的方向 recv/send/double |
IsVariadic | 判断函数是否接受可变参数 |
Elem | 取该类型的元素 |
In | 函数第n个入参 |
Out | 函数第n个出参 |
NumIn | 函数的入参数个数 |
NumOut | 函数的出参个数 |
Key | 返回map结构的key类型Type |
Len | 返回array的长度 |
Value独有的方法
方法名 | 备注 |
---|---|
Addr | v的指针,前提时CanAddr()返回true |
Bool | bool类型变量的值 |
Bytes | []bytes类型的值 |
Call | 调用函数 |
CallSlice | 调用具有可变参的函数 |
CanAddr | 判断能否取址 |
CanInterface | 判断Interface方法能否使用 |
CanSet | 判断v的值能否改变 |
Cap | 判断容量 Array/Chan/Slice |
Close | 关闭Chan |
Complex | |
Convert | 返回将v转换位type t的结果 |
Elem | 返回interface包含的实际值 |
Float | |
Index | 索引操作 Array/Slice/String |
Int | |
Interface | 将当前value以interface{}形式返回 |
IsNil | 判断是否为nil,chan, func, interface, map, pointer, or slice value |
IsValid | 是否是可操作的Value,返回false表示为zero Value |
Len | 适用于Array, Chan, Map, Slice, or String |
MapIndex | 对map类型按key取值 |
MapKeys | map类型的所有key的列表 |
OverflowComplex | |
OverflowFloat | 溢出判断 |
OverflowInt | |
OverflowUint | |
Pointer | 返回uintptr 适用于slice |
Recv | chan接收 |
Send | chan发送 |
Set | 将x赋值给v,类型要匹配 |
SetBool | |
SetBytes | |
SetCap | slice调整切片 |
SetMapIndex | map赋值 |
SetUint | |
SetPointer | unsafe.Pointer赋值 |
SetString | |
Slice | return v[i:j] 适用于Array/Slict/String |
String | return value的string表示方法 |
TryRecv | chan非阻塞接收 |
Try Send | chan非阻塞发送 |
Type | 返回value的Type |
UnsafeAddr | 返回指向value的data的指针 |
以上列出的方法及备注只是为了方便理解和记忆,使用时请参考go源码及package说明
Kind类型
type Kind uint
const (
Invalid Kind = iota
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
Array
Chan
Func
Interface
Map
Ptr
Slice
String
Struct
UnsafePointer
)
golang reflect包使用解析的更多相关文章
- golang中的reflect包用法
最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...
- golang包引用解析
golang包引用解析 环境变量配置如下: GOROOT----[C:\Go] GOPATH----[F:\workspace\go_home] vs code配置如下: F:\workspace\g ...
- Golang : cobra 包解析
笔者在<Golang : cobra 包简介>一文中简要的介绍了 cobra 包及其基本的用法,本文我们从代码的角度来了解下 cobra 的核心逻辑. Command 结构体 Comman ...
- Golang学习 - reflect 包
------------------------------------------------------------ 在 reflect 包中,主要通过两个函数 TypeOf() 和 ValueO ...
- Golang : pflag 包简介
笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...
- golang reflect知识集锦
目录 反射之结构体tag Types vs Kinds reflect.Type vs reflect.Value 2019/4/20 补充 reflect.Value转原始类型 获取类型底层类型 遍 ...
- golang reflect 简单使用举例
golang中的多态,主要由接口interface体现. 接口interface在实现上,包括两部分:动态类型和动态值. golang提供的reflect包可以用来查看这两部分. 动态类型 func ...
- golang reflect
golang reflect go语言中reflect反射机制.详细原文:地址 接口值到反射对象 package main import ( "fmt" "reflect ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
随机推荐
- nancyfx的安装笔记
这个安装时很简单的 只要 Install-Package Nancy.Hosting.Aspnet 就行了. 需要注意的是,千万不要用那个模板安装,通过创建nancyfx类型项目的方式安装是有问题的. ...
- EJB学习手记
周末两天,看了两天的ejb知识.公司有个转发消息的程序,里面是根据ejb/jms+cdi/event做的,这些之前没接触过. 总而言之,从中学到了很多东西,从ejb到webservice. jboss ...
- 代码修改之后MSbuild编译不出最新的dll解决方法
问题: 使用jenkins发布的时候,开发不断反馈自己修改的文件使用jenkins没有发布到测试环境.经过查证发现使用MSBUILD编译的时出现修改的文件编译出的日期不是最新日期,但是使用VS编译就不 ...
- sql-修改每条数据的某一个字段的值
update B set B.maildata =(select SUBSTRING(maildata,0,3) from basedata where basedata.cid = B.cid)+( ...
- sql 存储过程带有模糊查询条件
一个简单的存储过程: Create procedure [dbo].[Proc_SeachJob] (@startRecordIndex int, @endRecordIndex int, @seac ...
- PostMan工具使用之基础篇
PostMan工具使用之基础篇 一.什么是PostMan Postman一款非常流行的API调试工具.(其他测试工具 Jmeter.soapUI) 二.下载及安装: 1.下载: 下载地址:https: ...
- pageadmin CMS网站建设教程:网页设计的常用参数
由于网络速度问题,我们需要考虑图片大小对传输速度的影响,如果图片太大就会影响浏览速度,访问者很快就会对这个网站失去了兴趣,只有充分了解图片质量与下载速度的关系,并了解不同的文件格式,才能更有效的表达内 ...
- 「WC2006」水管局长
题目链接 戳我 \(Solution\) 这道题实际上是维护一个最小生成树,因为正的搞不好搞,所以反着搞会比较好,现将没有没删掉的边留下来生成一颗最小生成树,再加边就好了,现在\(LCT\) 来看看怎 ...
- mysql 批量更新的四种方法
批量更新的方法: 1 ) 逐条更新 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新 ...
- 【微信小程序】——wxss引用外部CSS文件及iconfont
小程序引入外部文件的方式是:@import "*/*.wxss"; 因为业务需要,正在开发的小程序中需要使用iconfont,很容易想到了H5的引入方式: ```` @font-f ...