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 ...
随机推荐
- 转-SourceTree注册atlassian账号SIGUP按钮灰色无法注册的问题
我们第一次安装sourcetree的时候会要求我们登陆一个账号 但是,会出现注册按钮变灰的怪现象 令人头疼的是,在官网也搞不定. 下面的网址可以顺利注册账号的网址 https://www.atlass ...
- Dockerfile文件参数详解
参考: https://www.jianshu.com/p/e4b31ca37043 https://blog.csdn.net/u010246789/article/details/54139168 ...
- 我对于C#的想法
前言 首先,感谢各位的回答,还看到了好几个大神过来回答受宠若惊,有叫我坚持的,有叫我放弃,感谢. 一开始我学的是Java,但是没有实际的工作经验,因为从工作开始到现在已经两年的时间了我用的一直都是C# ...
- 使用CDI+制作支持半透明的Panle
创建一个自定义控件程序集,并修改父类为Panle,添加如下代码: public partial class OpaqueLayer : Panel { private Color transparen ...
- Thread类
Thread类相对于线程池中的线程,使用者有更多的控制权.该类允许创建前台线程,设置线程优先级等.Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadSta ...
- “全栈2019”Java第八十九章:接口中能定义内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- C语言 一些算法
1,斐波那契数列 ①递归 时间复杂度O(2^n)#include <stdio.h> int fib(int n){ ||n==) ; ) + fib(n-); } int main(){ ...
- logstash-out-mongodb实现elasticsearch到Mongodb的数据同步
本文主要实现将Elasticsearch中的索引数据Index同步到Mongodb中的集合collection中. 0.前提 1)已经安装好源数据库:elasticsearch V2.X; 2)已经安 ...
- [Swift实际操作]八、实用进阶-(3)闭包在定时任务、动画和线程中的使用实际操作
闭包的使用相当广泛,它是可以在代码中被传递和引用的具有独立功能的模块.双击打开之前创建的空白项目.本文将演示闭包在定时任务.动画和线程中的使用.在左侧的项目导航区,打开视图控制器的代码文件:ViewC ...
- JSP的介绍及语法详解
一.简介 > HTML - HTML擅长显示一个静态的网页,但是不能调用Java程序. > Servlet - Servlet擅长调用Java程序和后台进行交互,但是它不擅长显示一个完整的 ...