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

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

成都创新互联主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、成都营销网站建设、网站程序开发、HTML5响应式重庆网站建设公司移动网站建设、微商城、网站托管及网站维护、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为成都石雕行业客户提供了网站推广服务。

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

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

这时候会有点懵,不知道作者想要干什么,实际上这就是此问题的答案。编译器会由此检查*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语言编译器自动检测类型是否实现接口
URL链接:http://azwzsj.com/article/pgsjgs.html