[TOC]
## 基本介绍
1. 反射可以在运行时动态获取变量的各种信息,比如变量的类型type,类别kind
2. 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)
3. 通过反射,可以修改变量的值,可以调用关联的方法
4. 使用反射,需要import("reflect")
## 功能
1. 从接口实例获取值
2. 从值获取接口(空接口)
3. 从接口实例获取值后改变这个值
## 重要函数和概念
1. reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型
2. reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型,reflect.Value是一个结构体类型,通过reflect.Value可以获取到关于该变量的很多信息
3. 变量、interface{}和reflect.Value是可以相互转换的
## 示意图
![](https://img.kancloud.cn/ff/42/ff4244cde6256c60f1922af0a2f326a3_1348x679.png)
![](https://img.kancloud.cn/21/7b/217b894ac8e369ad3b7a2dd28fb45a77_633x384.png)
## 注意事项
1. reflect.Value.Kind,获取变量的类别,返回的是一个常量
2. Type是类型,Kind是类别,Type和Kind可能是相同,也可能不同。如:int的Type是**int**,Kind也是**int**;struct的Type是**包.结构体名**,kind是**struct**
3. 通过反射可以让变量在interface{}和reflect.value中相互转换
4. 使用反射的方式来获取变量的值,要求数据类型匹配。比如x是int,则需要`reflect.ValueOf(x).Int()`,也可以使用断言
5. 通过反射来修改变量,主要当使用SetXXX方法来设置需要通过对应的指针类型来完成,这样才能改变传入的变量的值,同时需要使用到reflect.value.Elem()方法
![](https://img.kancloud.cn/32/d9/32d9bfb56a9f88626f35d8e36e509ac7_1143x428.png)
- 数据类型
- 数组array
- 切片slice
- 字符串string
- map
- 结构体struct
- 方法func
- 匿名结构体(继承)
- 字段别名
- 接口interface
- 常量
- 基础语法
- 循环for
- 遍历
- 函数func
- defer
- 异常处理error
- 访问范围
- 包
- 类型断言
- 文件
- 打开文件
- 读取文件
- 写文件
- 判断是否存在
- 拷贝文件
- JSON
- 序列化
- 反序列化
- 命令行
- 杂项
- Windows下配置加速
- 相关链接
- 占位符
- 随机数rand
- 单元测试
- goroutine
- 并发和并行
- 协程和主线程
- MPG模式
- 设置CPU数量
- 全局互斥锁
- 管道
- 示例1
- 示例2
- select
- 异常捕获
- 反射
- 示例
- 示例-改变值
- 网络编程
- TCP编程
- 示例一
- redis