您好,登錄后才能下訂單哦!
本篇文章為大家展示了Go語言編譯器自動檢測類型是否實現接口,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
經常看到一些開源庫里會有一些類似下面這種奇怪的用法:
這時候會有點懵,不知道作者想要干什么,實際上這就是此問題的答案。編譯器會由此檢查*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語言編譯器自動檢測類型是否實現接口,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。