反射可以作为了解,不必深入!

反射介绍

Go语音提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,但是在编译时并不知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。
Go程序在运行期使用reflect包访问程序的反射信息。

reflect包

反射是由 reflect 包提供支持. 它定义了两个重要的类型, Type 和 Value.任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。

TypeOf

reflect.TypeOf()函数可以获得任意值的类型对象(reflect.Type)。

func reflectTYpe(x interface{})  {
v := reflect.TypeOf(x)
fmt.Printf("type:%v\n",v)
} func main() {
var a int = 10
reflectTYpe(a) //type:int
var b float32 = 1.1
reflectTYpe(b) //type:float32
var c bool = false
reflectTYpe(c) //type:bool
}

type name和type kind

在反射中关于类型还划分为两种:类型(Type)和种类(Kind)。种类(Kind)就是指底层的类型.

type myInt int64

func reflectType(x interface{})  {
t := reflect.TypeOf(x)
fmt.Printf("type:%v kind:%v\n",t.Name(),t.Kind())
} func main() {
var a int64
var b *float32
var c myInt
var d rune
reflectType(a) //type:int64 kind:int64
reflectType(b) //type: kind:ptr
reflectType(c) //type:myInt kind:int64
reflectType(d) //type:int32 kind:int32 type stu struct {
name string
id int64
age int64
}
type person struct {
do string
}
var e = stu{
name:"ares",
id:1,
age:18,
}
var f = person{
do:"study go",
}
reflectType(e) //type:stu kind:struct
reflectType(f) //type:person kind:struct

Go语言的反射中像数组、切片、Map、指针等类型的变量,它们的.Name()都是返回空。
在reflect包中定义的Kind类型如下:

type Kind uint
const (
Invalid Kind = iota // 非法类型
Bool // 布尔型
Int // 有符号整型
Int8 // 有符号8位整型
Int16 // 有符号16位整型
Int32 // 有符号32位整型
Int64 // 有符号64位整型
Uint // 无符号整型
Uint8 // 无符号8位整型
Uint16 // 无符号16位整型
Uint32 // 无符号32位整型
Uint64 // 无符号64位整型
Uintptr // 指针
Float32 // 单精度浮点数
Float64 // 双精度浮点数
Complex64 // 64位复数类型
Complex128 // 128位复数类型
Array // 数组
Chan // 通道
Func // 函数
Interface // 接口
Map // 映射
Ptr // 指针
Slice // 切片
String // 字符串
Struct // 结构体
UnsafePointer // 底层指针
)

最新文章

  1. 模拟搭建Web项目的真实运行环境(七)
  2. 利用http缓存数据
  3. OAF_开发系列18_实现OAF页面跳转setForwardURL / forwardImmediately(案例)
  4. ubuntu 挂载新硬盘
  5. Java设计模式-单例模式(Singleton)
  6. easyui_tree 复选框 动态加载树
  7. SVN与eclipse整合和利用、SVN与Apache综合
  8. NVIC
  9. HTMLTestRunner测试报告中文乱码问题解决
  10. 安装windows 10到固态硬盘实践记录
  11. BZOJ 3864
  12. bootstrap学习: 基本组件以及布局;
  13. 12.1-uC/OS-III调度的内部实现
  14. 10-openldap同步原理
  15. QQ音乐flac音乐转MP6格式怎样实现
  16. Python标准数据类型的二次加工
  17. ethernaut 以太坊靶场学习 (1-12)
  18. css3中webkit内核的滚动栏样式
  19. css中:hover空格
  20. 跟我学算法- tensorflow 卷积神经网络训练验证码

热门文章

  1. IO中断
  2. phpcms企业站的一些知识
  3. HANA数据库无法停止
  4. java.sql.Date和java.sql.Timestamp转换
  5. JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止
  6. ORA-03113:通信通道的文件结尾 解决办法
  7. linux命令详解
  8. charles 手机证书下载安装
  9. python算法与数据结构-常用查找算法一(37)
  10. 10 loader - 配置处理less文件的loader