反射之自我探索-比较乱

https://studygolang.com/articles/2157 好的反射文章

https://mp.weixin.qq.com/s/ndOAUNRxwMmbCfNssUK4sg

反射提供了一种通过镜子窥私的方式,直接窥探的是编译器编译的那段代码:类型啦,值啦,这两块东西。

我认为反射就像一面镜子,镜子前面站着一个接口类型的变量,经过反射,镜子后面照出了这个变量里的一对信息:value,concrete type,也可以说反射解包了接口变量。通过反射,可以由接口到反射对象,也可以由反射对象回到接口,也可以修改反射对象的值,若要修改反射对象,值必须是可设置的,可设置指的是:一个反射对象可以对创建它的实际内容进行修改,这就是“可设置”。反射对象的“可设置性”由它是否拥有原项目(orginal item)所决定。根本原因当然是go中一切都是值拷贝啦~

value.Elem():通过指针定向,并把结果保存在返回的value中,可以对返回的value设置。

也就是说,如果要修改镜子前面的变量,需要镜子前面站着接口对象的地址,然后通过反射,也就是镜子,可以照到,地址类型的value和type,若要修改接口变量内的值,需要通过指针定向。

==============================================

反射,把一个对象转换成any类型//返回的是一个any类型的对象
再把这个接口类型的对象转换成具体类型(通过断言),返回的是转换后的对象,以及成功标识
反射的理解=【反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制】
变量=类型+值(type, value)
--我认为类型就是框架,就是房子
--值就是住进去的人+房子

类型分为:
    static type和concrete type(--我认为可以看做局部类型 + 实体类型)简单来说 static type是你在编码是看见的类型(如int、string),concrete type是runtime系统看见的类型
--我认为局部类型是你从一个角度看房子,看到的类型,属于局部框架:就像你说一个房子,如果房子实现了厕所,你也可以从某种角度上说,这个房子是个厕所,因为你当厕所用的。
--实体类型:是编译器看到的类型,这个房子既实现了厕所功能,又有厨房功能,还有卧室功能,这才是一个完整的真实的框架类型。

类型断言能否成功,取决于变量的concrete type,而不是static type. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer.

反射,就是建立在类型之上的,Golang的指定类型的变量的类型是静态的(也就是指定int、string这些的变量,它的type是static type),在创建变量的时候就已经确定,反射主要与Golang的interface类型相关(它的type是concrete type),只有interface类型才有反射一说。
反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制。


反射可以把接口类型变量”转换为“反射类型对象”,反射类型指的是reflect.Type和reflect.Value这两种
==============================反射的作用

#########反射规则(一) - 从接口到反射对象
类型断言:上面的所展示表达式是一个类型断言,【它断言了r中所包含的数据项实现了io.Writer】。

接口的静态类型决定了接口变量的哪些方法会被调用,即便也许它所含的具体值有一个更大的方法集。

代码中给出的类型越抽象,信息越少(抽象到极点就是Object);类型越具体,信息越多,编译器就能够对代码进行更详细的检查和更好的优化。
当我们调用reflect.TypeOf(x)时,作为参数传入的x在此之前已被存进了一个空接口。而reflect.TypeOf解包了空接口,恢复了它所含的类型信息。

相对的,reflect.ValueOf函数则是恢复了值。
reflect.Type和reflect.Value拥有许多方法让我们可以审查和操作接口变量】。一个重要的例子就是Value有一个Type方法返回reflect.Value的Type。
另一个例子就是,【Type和Value都有Kind方法,它返回一个常量,这个常量表示了被存储的元素的排列顺序:Uint, Float64, Slice等等】

反射对象的Kind方法描述的是基础类型,而不是静态类型。如果一个反射对象包含了用户定义类型的值,如下:

type MyInt int
var x MyInt = 7
v := reflect.ValueOf(x)
虽然x的静态类型是MyInt而非int,但v的Kind依然是reflect.Int。虽然Type可以区分开int和MyInt,但Kind无法做到。
############反射规则(二) - 从反射对象到接口

############反射规则(三) - 若要修改反射对象,值必须可设置


=========静态类型和动态类型===============
直接解释静态类型和动态类型的定义,一个对象(变量)的静态类型就是其声明类型,如表达式int a中的int就是对象a的声明类型,即静态类型;而一个对象(变量)的动态类型就是指程序执行过程中对象(指针或引用)实际所指对象的类型,如Base* pB = new Drived; 其中class Drived继承于class Base,则指针对象pB的静态类型就是Base(声明类型),动态类型就是Drived(实际所指对象的类型),又如Base* pB = new Base;此时指针对象pB的静态类型和动态类型也是相等的,都是Base。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值