<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] >[success] ## **1:基本介紹** interface類型可以定義一組方法,但是這些不需要實現。**并且interface不能包含任何變量**。到某個自定義類型(比如結構體Phone)要使用的時候,在根據具體情祝把這些方法寫出來。 ![](https://img.kancloud.cn/4b/89/4b896ac9ae4ce066480073d385988349_1280x295.png) <br> <br> >[success] ## **2:概念說明** 1)接口里的所有方法都沒有方法體,即接口的方法都是沒有實現的方法。接口體現了程序設計的多態和高內聚低偶合的思想。 2)Golang中的接口, 不需要顯式的實現。只要一個變量,含有接口類型中的所有方法,那么這個變量就實現這個接口。因此,Golang中沒有implement這樣的關鍵字 <br> <br> >[success] ## **3,注意事項和細節** 1)接口本身不能創建實例,但是可以指向一個實現了該接口的自定義類型的變 量(實例) **錯誤用法:** ![](https://img.kancloud.cn/db/d9/dbd9c223866cfb75f3bebf704eb62eba_1280x491.png) **正確用法:** ![](https://img.kancloud.cn/2e/3c/2e3ce1de882301f81e395bf1c6cd8686_1280x643.png) 2)接口中所有的方法都沒有方法體,即都是沒有實現的方法。 3)在Golang中,一個自定義類型需要將某個接口的所有方法都實現,我們說 這個自定義類型實現了該接口。 4)一個自定義類型只有實現了某個接口,才能將該自定義類型的實例(變量) 賦給接口類型。 5)只要是自定義數據類型,就可以實現接口,不僅僅是結構體類型。 ![](https://img.kancloud.cn/04/1b/041b05a2e13406abba8c0dbec61a06fe_1280x472.png) <br> <br> 6)一個自定義類型可以實現多個接口 ![](https://img.kancloud.cn/f4/bf/f4bf2079b9947c85aff7439d77c97903_936x720.png) <br> <br> 7)Golang接口中不能有任何變量 ![](https://img.kancloud.cn/7a/44/7a447ca63b3e7239de1fb1b2cb75a97e_1280x223.png) <br> <br> 8)一個接口(比如A接口)可以繼承多個別的接口(比如B,C接口),這時如果要實現A接,也必須將B,C接口的方法也全部實現。 ![](https://img.kancloud.cn/83/9a/839a539cd6d5175d832ca7e7d2dcc54b_767x720.png) <br> <br> 9)interface類型默認 是一個指針(**引用類型**)**引用類型先指向地址,地址指向內存中的值,**如果沒有對interface初始化就使用,那么會輸出nil <br> <br> 10)空接interface{}沒有任何方法,所以所有類型都實現了空接口,所以我們可以把所有的數據類型傳給空接口\[案例演示\] ![](https://img.kancloud.cn/a4/6c/a46ca4b1bc12e1b3b4aabdc93b9cd441_1280x681.png) >[success] ## **4:接口最佳實現** 實現對Hero結構體切片的排序: sort.Sort(data Interface) 兩種實現方法:第一種自己寫冒泡排序,第二種系統內置方法sort方法 * [ ] sort方法實現 ![](https://img.kancloud.cn/5d/57/5d57af814db0fb8d2228bc3a31a62119_1280x519.png) <br> <br> >[success] ## **5:接口VS繼承** ### **實例1** ![](https://img.kancloud.cn/20/4f/204f1466c2a14f42a0a788d276ee0e6e_824x720.png) * [ ] 對上面代碼的小結 1)當A結構體繼承了B結構體,那么A結構就自動的繼承了B結構體的字段和方法,并且可以直接使用 2)當A結構體需要擴展功能,同時不希望去破壞繼承關系,則可以去實現某個接口即可,因此我們可以認為實現接口是對繼承機制的補充 ### **實例2** * [ ] 接口和繼承解決的解決的問題不同 **繼承的價值主要在于:** 解決代碼的復用性和可維護性。 **接口的價值主要在于:設計**,設計好各種規范(方法),讓其它自定義類型去實現這些 方法。 * [ ] 接口比繼承更加靈活 接口比繼承更加靈活,繼承是滿足is - a的關系,而接口只需滿足like - a的關系。 * [ ] 接口在一定程度上實現代碼解耦 <br> <br> >[success] ## **6:類型斷言** ### **1:類型斷言的初時** ![](https://img.kancloud.cn/ed/2c/ed2c87c1d6c24d74d7dea1ef928dec74_1280x426.png) ### **2:類型斷言基本介紹** * [ ] 類型斷言,由于接口是一般類型,不知道具體類型,如果要轉成具體類型,就需要使用類型斷言,具體的如下: ``` var t float32 var x interface{} x = t y := x.(float32) //轉換成float32 ``` **注**:上面的代碼,將括號中的float32修改為【x.(float64)】是否可以斷言成功呢?結果是panic錯誤,因為x在之前的類型已經是float32,在轉換成float64會報錯 * [ ] 思考:當我們使用斷言的時候,怎么知道斷言是否成功了呢?答案是:帶上監測機制,實例如下 ![](https://img.kancloud.cn/57/60/5760f5d95df79b8c7ee4e23fbdc994b0_1218x720.png) <br> <br> >[success] ## **7:類型斷言的最佳實踐** 1. 寫一個函數,循環判斷傳入參數的類型 ![](https://img.kancloud.cn/56/c6/56c657fe39d30e4ea2ebb619d2f65cb9_1013x720.png) <br> 2. 如何判斷指針類型和結構體 ![](https://img.kancloud.cn/65/66/6566d05014262839d12022075460d0ff_928x720.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看