先看一个问题,反射的使用场景

使用反射机制,编写函数的适配器, 桥连接

反射的基本介绍

基本介绍

  1. 反射可以在运行时动态获取变量的各种信息, 比如变量的类型(type),类别(kind)
  2. 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)
  3. 通过反射,可以修改变量的值,可以调用关联的方法。
  4. 使用反射,需要 import (“reflect”) 5)

示意图

反射的应用场景


反射重要的函数和概念
3) 变量、interface{} 和 reflect.Value 是可以相互转换的,这点在实际开发中,会经常使用到。画 出示意图

反射的快速入门

快速入门说明
请编写一个案例,演示对(基本数据类型/结构体类型、interface{}、reflect.Value)进行反射的基本操作

代码演示

package main
import ("reflect" "fmt"
)//专门演示反射
func reflectTest01(b interface{}) {//通过反射获取的传入的变量的 type , kind, 值//1. 先获取到 reflect.Type rTyp := reflect.TypeOf(b) fmt.Println("rType=", rTyp)//2. 获取到 reflect.Value rVal := reflect.ValueOf(b)n2 := 2 + rVal.Int() fmt.Println("n2=", n2)fmt.Printf("rVal=%v rVal type=%T\n", rVal, rVal)//下面我们将 rVal 转成 interface{} iV := rVal.Interface()//将 interface{} 通过断言转成需要的类型num2 := iV.(int) fmt.Println("num2=", num2)
}//专门演示反射[对结构体的反射]
func reflectTest02(b interface{}) {//通过反射获取的传入的变量的 type , kind, 值//1.  先获取到 reflect.TyperTyp := reflect.TypeOf(b) fmt.Println("rType=", rTyp)//2. 获取到 reflect.Value rVal := reflect.ValueOf(b)//下面我们将 rVal 转成 interface{} iV := rVal.Interface()fmt.Printf("iv=%v iv type=%T \n", iV, iV)//将 interface{} 通过断言转成需要的类型//这里,我们就简单使用了一带检测的类型断言.//同学们可以使用 swtich 的断言形式来做的更加的灵活stu, ok := iV.(Student) if ok {fmt.Printf("stu.Name=%v\n", stu.Name)}
}type Student struct { Name string Age int
}
type Monster struct { Name stringAge int
}func main() {//请编写一个案例,//演示对(基本数据类型、interface{}、reflect.Value)进行反射的基本操作//1.  先定义一个 int// var num int = 100// reflectTest01(num)//2. 定义一个 Student 的实例stu := Student{ Name : "tom", Age : 20,}reflectTest02(stu)
}

反射的注意事项和细节

  1. reflect.Value.Kind,获取变量的类别,返回的是一个常量
  2. Type 和 Kind 的区别
    Type 是类型, Kind 是类别, Type 和 Kind 可能是相同的,也可能是不同的.
    比如: var num int = 10 num 的 Type 是 int , Kind 也是 int
    比如: var stu Student stu 的 Type 是 pkg1.Student , Kind 是 struct

  1. 通过反射的来修改变量, 注意当使用 SetXxx 方法来设置需要通过对应的指针类型来完成, 这样才能改变传入的变量的值, 同时需要使用到 reflect.Value.Elem()方法
  2. reflect.Value.Elem() 应该如何理解?

反射课堂练习

  1. 给你一个变量 var v float64 = 1.2 , 请使用反射来得到它的 reflect.Value, 然后获取对应的 Type, Kind 和值,并将 reflect.Value 转换成 interface{} , 再将 interface{} 转换成 float64. [不说:]
  2. 看段代码,判断是否正确,为什么

Golang笔记——反射相关推荐

  1. Golang的反射reflect深入理解和示例

    [TOC] Golang的反射reflect深入理解和示例 [记录于2018年2月] 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机 ...

  2. Golang笔记——channel(管道)

    推荐首先阅读:Golang笔记--goroutine(协程) 为什么需要 channel 前面使用全局变量加锁同步来解决 goroutine 的通讯,但不完美 主线程在等待所有 goroutine 全 ...

  3. golang利用反射写入excel的简单工具类

    golang利用反射写入excel的简单工具类 工具类源码 使用方法 工具类源码 package excelimport ("errors""github.com/tea ...

  4. golang笔记15--go语言单任务版爬虫

    golang笔记15--go语言单任务版爬虫 1 介绍 2 单任务版爬虫 2.1 获得初始页面内容 2.2 正则表达式 2.3 提取城市和 url 2.4 单任务版爬虫的架构 2.5 Engine 与 ...

  5. golang笔记16--go语言并发版爬虫

    golang笔记16--go语言并发版爬虫 1 介绍 2 并发版爬虫 2.1 并发版爬虫架构 2.2 简单调度器 2.3 并发调度器 2.4 队列实现调度器 2.5 重构和总结 2.6 更多城市 2. ...

  6. GoLang笔记—基础语法篇

    GoLang笔记 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态类型.编译型语言.Go 语言语法与 C ...

  7. golang笔记09--go语言测试与性能调优

    golang笔记09--go语言测试与性能调优 1 介绍 2 测试与性能调优 2.1 测试介绍 2.2 代码覆盖率和性能测试 2.3 使用pprof进行性能调优 2.4 测试http服务器(上) 2. ...

  8. Golang笔记——结构体

    结构体 看一个问题 使用现有技术解决 单独的定义变量解决 代码演示: 使用数组解决 现有技术解决的缺点分析 使用变量或者数组来解决养猫的问题,不利于数据的管理和维护.因为名字,年龄,颜色都是 属于一只 ...

  9. 红橙Darren视频笔记 反射注解泛型简介

    1. 反射 作用:能够做一般做不到的事情,即获取私有方法 变量 构造方法 或者调用添加@hide的方法.比如XUtil的IOC( https://blog.csdn.net/u011109881/ar ...

最新文章

  1. mysql对于大表(千万级),要怎么优化呢?
  2. android浮动文本,android 添加浮动标签在textView最尾端,自动换行
  3. timestomping 修改文件时间戳
  4. Java锁详解之ReentrantLock
  5. 【转】根据起止日期+时间取数
  6. 第十章 优先级队列 (b3)完全二叉堆:删除与下滤
  7. [Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]
  8. 互联网日报 | 4月20日 星期二 | 华为正式宣布卖车;携程在港交所挂牌上市;广州期货交易所正式揭牌...
  9. Windows下安装python2和python3双版本
  10. 链接生成动态二维码图片显示在页面上
  11. 学习计划(11.5)
  12. bmp转YUV RGB转YUV HM学习
  13. 培训协议与服务器有没有要求,上面说的是提供专业培训且规定了服务器和培训费以及违约金的问题。试用期辞职单位有没有权利追究违约金呢?- 法律快车法律咨询...
  14. 资源 |不要再问我什么数学水平才能学机器学习啦【文末彩蛋】
  15. ORBSLAM关键帧的筛选和插入
  16. Windows 微软雅黑(Microsoft YaHei)+ Monaco 字体整合方案
  17. python读pdf/双层pdf
  18. STM32F205RBT6的USB_BULK数据传输,并使用libusb_win32编写上位机进行数据读写,配有pcb文件
  19. LC-3下汇编实现简易版四子棋的游戏
  20. 那些曾让我一脸懵逼的python代码

热门文章

  1. Spring Boot Redis缓存
  2. AduSkin - UI 追求极致,永臻完美
  3. Weblogic11g安装部署-winserver篇
  4. 地表最强mysql命令行连接工具mycli
  5. WeChat.app debuger
  6. 用朴素的英语解释9种关键机器学习算法
  7. Java 统计字母个数
  8. 基于python开发的口罩供需平台
  9. Express-generator
  10. 【CCF】201612-1中间数