大家好,我是明哥。


由于某些不可抗力,之前该专栏的所有内容都被删除了。因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒。






1. 静态类型


所谓的静态类型(即 static type),就是变量声明的时候的类型。



它是你在编码时,肉眼可见的类型。


2. 动态类型


所谓的 动态类型(即 concrete type,也叫具体类型)是 程序运行时系统才能看见的类型。


这是什么意思呢?


我们都知道 空接口 可以承接什么问题类型的值,什么 int 呀,string 呀,都可以接收。


比如下面这几行代码



iinterface{}iinterface{}


i


i


i=18i="Go编程时光"


3. 接口组成


每个接口变量,实际上都是由一 pair 对(type 和 data)组合而成,pair 对中记录着实际变量的值和类型。


比如下面这条语句



我们声明了一个 int 类型变量,变量名叫 age ,其值为 25





知道了接口的组成后,我们在定义一个变量时,除了使用常规的方法(可参考:)


也可以使用像下面这样的方式



输出如下



4. 接口细分


ifaceeface


iface


第一种:iface,表示带有一组方法的接口。


比如



iface





iface 的源码如下:



eface


第二种:eface,表示不带有方法的接口


比如



eface 的源码如下:






5.理解动态类型


前两节,我们知道了什么是动态类型?如何让一个对象具有动态类型?


后两节,我们知道了接口分两种,它们的内部结构各是什么样的?


那最后一节,可以将前面四节的内容结合起来,看看在给一个空接口类型的变量赋值时,接口的内部结构会发生怎样的变化 。


iface


先来看看 iface,有如下一段代码:



iface





*os.File*os.File





eface


再来看看 eface,有如下一段代码:



interface{}_type





*os.File_type*os.File





6. 反射的必要性


由于动态类型的存在,在一个函数中接收的参数的类型有可能无法预先知晓,此时我们就要对参数进行反射,然后根据不同的类型做不同的处理。


关于 反射 的内容有点多,我将其安排在下一篇。


参考文章






好了,今天的文章就到这里了。


若今天的分享对你有帮助,不如点个赞,支持一下?