Go語言編譯器自動(dòng)檢測(cè)類型是否實(shí)現(xiàn)接口-創(chuàng)新互聯(lián)

本篇文章為大家展示了Go語言編譯器自動(dòng)檢測(cè)類型是否實(shí)現(xiàn)接口,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元寧化做網(wǎng)站,已為上家服務(wù),為寧化各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

編譯器自動(dòng)檢測(cè)類型是否實(shí)現(xiàn)接口

經(jīng)??吹揭恍╅_源庫(kù)里會(huì)有一些類似下面這種奇怪的用法:

這時(shí)候會(huì)有點(diǎn)懵,不知道作者想要干什么,實(shí)際上這就是此問題的答案。編譯器會(huì)由此檢查*myWriter類型是否實(shí)現(xiàn)了io.Writer接口。

實(shí)際上,上述賦值語句會(huì)發(fā)生隱式地類型轉(zhuǎn)換,在轉(zhuǎn)換的過程中,編譯器會(huì)檢測(cè)等號(hào)右邊的類型是否實(shí)現(xiàn)了等號(hào)左邊接口所規(guī)定的函數(shù)。

接口的構(gòu)造過程是怎樣的

我們已經(jīng)看過了iface和eface的源碼,知道iface最重要的是itab和_type。

為了研究清楚接口是如何構(gòu)造的,接下來我會(huì)拿起匯編的武器,還原背后的真相。

把每個(gè)字段的大小相加,itab結(jié)構(gòu)體的大小就是40字節(jié)。上面那一串?dāng)?shù)字實(shí)際上是itab序列化后的內(nèi)容,注意到大部分?jǐn)?shù)字是0,從24字節(jié)開始的4個(gè)字節(jié)da9f20d4實(shí)際上是itab的hash值,這在判斷兩個(gè)類型是否相同的時(shí)候會(huì)用到。

下面兩行是鏈接指令,簡(jiǎn)單說就是將所有源文件綜合起來,給每個(gè)符號(hào)賦予一個(gè)全局的位置值。這里的意思也比較明確:前8個(gè)字節(jié)最終存儲(chǔ)的是type."".Person的地址,對(duì)應(yīng)itab里的inter字段,表示接口類型;8-16字節(jié)最終存儲(chǔ)的是type."".Student的地址,對(duì)應(yīng)itab里_type字段,表示具體類型。

第二個(gè)參數(shù)就比較簡(jiǎn)單了,它就是數(shù)字18的地址,這也是初始化Student結(jié)構(gòu)體的時(shí)候會(huì)用到。

在main函數(shù)里,先構(gòu)造出一個(gè)接口對(duì)象qcrao,然后強(qiáng)制類型轉(zhuǎn)換,最后讀取出hash值,非常妙!你也可以自己動(dòng)手試一下。

上述內(nèi)容就是Go語言編譯器自動(dòng)檢測(cè)類型是否實(shí)現(xiàn)接口,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:Go語言編譯器自動(dòng)檢測(cè)類型是否實(shí)現(xiàn)接口-創(chuàng)新互聯(lián)
文章出自:http://muchs.cn/article22/hsdcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、關(guān)鍵詞優(yōu)化、App設(shè)計(jì)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站