大家好,我是明哥。
由于某些不可抗力,之前该专栏的所有内容都被删除了。因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒。
1. 静态类型
所谓的静态类型(即 static type),就是变量声明的时候的类型。
它是你在编码时,肉眼可见的类型。
2. 动态类型
所谓的 动态类型(即 concrete type,也叫具体类型)是 程序运行时系统才能看见的类型。
这是什么意思呢?
我们都知道 空接口 可以承接什么问题类型的值,什么 int 呀,string 呀,都可以接收。
比如下面这几行代码
iinterface{}iinterface{}iii=18i="Go编程时光"3. 接口组成
每个接口变量,实际上都是由一 pair 对(type 和 data)组合而成,pair 对中记录着实际变量的值和类型。
比如下面这条语句
我们声明了一个 int 类型变量,变量名叫 age ,其值为 25
知道了接口的组成后,我们在定义一个变量时,除了使用常规的方法(可参考:)
也可以使用像下面这样的方式
输出如下
4. 接口细分
ifaceefaceiface
第一种:iface,表示带有一组方法的接口。
比如
ifaceiface 的源码如下:
eface
第二种:eface,表示不带有方法的接口
比如
eface 的源码如下:
5.理解动态类型
前两节,我们知道了什么是动态类型?如何让一个对象具有动态类型?
后两节,我们知道了接口分两种,它们的内部结构各是什么样的?
那最后一节,可以将前面四节的内容结合起来,看看在给一个空接口类型的变量赋值时,接口的内部结构会发生怎样的变化 。
iface
先来看看 iface,有如下一段代码:
iface*os.File*os.Fileeface
再来看看 eface,有如下一段代码:
interface{}_type*os.File_type*os.File6. 反射的必要性
由于动态类型的存在,在一个函数中接收的参数的类型有可能无法预先知晓,此时我们就要对参数进行反射,然后根据不同的类型做不同的处理。
关于 反射 的内容有点多,我将其安排在下一篇。
参考文章
好了,今天的文章就到这里了。
若今天的分享对你有帮助,不如点个赞,支持一下?