golang reflect包使用解析

参考

  1. Go反射编码

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包使用解析的更多相关文章

  1. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  2. golang包引用解析

    golang包引用解析 环境变量配置如下: GOROOT----[C:\Go] GOPATH----[F:\workspace\go_home] vs code配置如下: F:\workspace\g ...

  3. Golang : cobra 包解析

    笔者在<Golang : cobra 包简介>一文中简要的介绍了 cobra 包及其基本的用法,本文我们从代码的角度来了解下 cobra 的核心逻辑. Command 结构体 Comman ...

  4. Golang学习 - reflect 包

    ------------------------------------------------------------ 在 reflect 包中,主要通过两个函数 TypeOf() 和 ValueO ...

  5. Golang : pflag 包简介

    笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...

  6. golang reflect知识集锦

    目录 反射之结构体tag Types vs Kinds reflect.Type vs reflect.Value 2019/4/20 补充 reflect.Value转原始类型 获取类型底层类型 遍 ...

  7. golang reflect 简单使用举例

    golang中的多态,主要由接口interface体现. 接口interface在实现上,包括两部分:动态类型和动态值. golang提供的reflect包可以用来查看这两部分. 动态类型 func ...

  8. golang reflect

    golang reflect go语言中reflect反射机制.详细原文:地址 接口值到反射对象 package main import ( "fmt" "reflect ...

  9. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

随机推荐

  1. 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 2、数据框架 和 功能预览

    说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...

  2. 详解CSS盒模型

    原文地址:http://luopq.com/2015/10/26/CSS-Box-Model/ 本文主要是学习CSS盒模型的笔记,总结了一些基本概念,知识点和细节. 一些基本概念 HTML的大多数元素 ...

  3. 如何在TortoiseGit中使用ssh-keygen生成的key

    再windows 用TortoiseGit 时,git clone 项目时 提示 "Couldn't load this key (OpenSSH SSH-2 private key),如下 ...

  4. ajax 与 form 提交的区别

    有如下几种区别: 1. Ajax在提交.请求.接收时,都是异步进行的,网页不需要刷新:Form提交则是新建一个页面,哪怕是提交给自己本身的页面,也是需要刷新的: 2. A在提交时,是在后台新建一个请求 ...

  5. PostgreSQL递归查询

    原料 --创建组织架构表 create table "Org"( "OrgId" ) primary key, "ParentId" ), ...

  6. .net core redis使用

    整理下.net core的redis使用  可以分布式 Nuget安装 StackExchange.Redis using System; using System.Collections.Gener ...

  7. git log 与 git reflog 的 区别

    git log: commit 的版本日志 包含提交的版本 操作者 日期 (方便查看commit的版本,但是版本回退后,使用git log 看不到回退版本号之后的版本记录) commit ce0d69 ...

  8. JAVA数组的定义方式

    JAVA中,数组有以下几种定义方式: 1.先定义数组中元素的个数,然后再进行元素赋值 int[] a=new int[2]; a[0]='a'; a[1]='b';a[2]='c'; 2.元素个数与元 ...

  9. FutureTask与Fork/Join

    在学习多线程的过程中,我们形成了一种思维习惯.那就是对于某个耗时操作不再做同步操作,让他分裂成一个线程之后执行下一步,而线程执行耗时操作.并且我们希望在我们需要它返回的时候再去调用它的结果集.好比我们 ...

  10. 零基础学习Python数据分析

    网上虽然有很多Python学习的教程,但是大多是围绕Python网页开发等展开.数据分析所需要的Python技能和网页开发等差别非常大,本人就是浪费了很多时间来看这些博客.书籍.所以就有了本文,希望能 ...