Go语言编译器自动检测类型是否实现接口-创新互联

本篇文章为大家展示了Go语言编译器自动检测类型是否实现接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

成都创新互联自2013年创立以来,是专业互联网技术服务公司,拥有项目成都网站建设、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元宁化做网站,已为上家服务,为宁化各地企业和个人服务,联系电话:18982081108

编译器自动检测类型是否实现接口

经常看到一些开源库里会有一些类似下面这种奇怪的用法:

这时候会有点懵,不知道作者想要干什么,实际上这就是此问题的答案。编译器会由此检查*myWriter类型是否实现了io.Writer接口。

实际上,上述赋值语句会发生隐式地类型转换,在转换的过程中,编译器会检测等号右边的类型是否实现了等号左边接口所规定的函数。

接口的构造过程是怎样的

我们已经看过了iface和eface的源码,知道iface最重要的是itab和_type。

为了研究清楚接口是如何构造的,接下来我会拿起汇编的武器,还原背后的真相。

把每个字段的大小相加,itab结构体的大小就是40字节。上面那一串数字实际上是itab序列化后的内容,注意到大部分数字是0,从24字节开始的4个字节da9f20d4实际上是itab的hash值,这在判断两个类型是否相同的时候会用到。

下面两行是链接指令,简单说就是将所有源文件综合起来,给每个符号赋予一个全局的位置值。这里的意思也比较明确:前8个字节最终存储的是type."".Person的地址,对应itab里的inter字段,表示接口类型;8-16字节最终存储的是type."".Student的地址,对应itab里_type字段,表示具体类型。

第二个参数就比较简单了,它就是数字18的地址,这也是初始化Student结构体的时候会用到。

在main函数里,先构造出一个接口对象qcrao,然后强制类型转换,最后读取出hash值,非常妙!你也可以自己动手试一下。

上述内容就是Go语言编译器自动检测类型是否实现接口,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。


当前标题:Go语言编译器自动检测类型是否实现接口-创新互联
文章转载:http://ybzwz.com/article/hsdcc.html