golang reflect包使用解析
参考
- Go反射编码
2个重要的类型
其中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
)