Go的介面總結

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

一、什麼是介面

    • 介面類型是一種抽象的類型,它描述了一系列方法的集合。
    • 介面約定:介面類型中定義的方法即為約定,若一個具體類型實現了所有這些方法,則該類型就滿足該介面的約定,或者說它是這個介面類型的執行個體(實現了該介面)。
    • 可替換性(LSP裡氏替換):滿足相同介面約定的類型之間可進行相互替換。例如:若一個方法的形參定義為介面類型,那麼它可以接收任何滿足該介面約定的類型的實參。
    • 介面內嵌:介面類型可通過組合已有的介面來定義
    • io.Writer介面提供了所有的類型寫入bytes的抽象,包括檔案類型,記憶體緩衝區,網路連結,HTTP用戶端,壓縮公用程式,雜湊等等;io.Reader可以代表任意可以讀取bytes的類型,io.Closer可以是任意可以關閉的值,例如一個檔案或是網路連結。還有fmt.Stringer介面等
    • 介面類型名一般以“er”結尾

二、什麼是介面值

    • 介面值:即介面變數的值,由兩個部分組成,一個具體的類型和那個類型的值。它們被稱為介面的動態類型和動態值
    • 介面值的零值:動態類型type和對應的動態值value均為nil,如var w io.Writer
    • 空介面值:若且唯若介面的動態類型type和對應的動態值value均為nil時,才為空白介面值,此時它等於nil
    • 介面變數的賦值與調用過程:
      • 如w = os.Stdout,這個賦值程序呼叫了一個具體類型到介面類型的隱式轉換,這和顯式的使用io.Writer(os.Stdout)是等價的。這個介面值w的動態類型被設為*os.Stdout指標的類型描述元,它的動態值持有os.Stdout的拷貝
      • 調用一個包含*os.File類型指標的介面值的Write方法,w.Write([]byte("hello")) ,使得(*os.File).Write方法被調用
    • 一個介面值可以持有任意大的動態值,不論動態值多大,介面值總是可以容下它
    • 介面值的可比較性:
      • 時刻記住:只能比較動態類型是可比較類型的介面值。
      • 如果介面值的動態類型是可比較的,那麼它們之間就可以使用==和!=來進行比較:兩個介面值相等僅當它們都是nil值或者它們的動態類型相同並且動態值也根據這個動態類型的==操作相等。
      • 如果介面值是可比較的,那麼它們可以用在map的鍵或者作為switch語句的運算元
      • 非介面類型要麼是安全的可比較類型(如基本類型和指標)要麼是完全不可比較的類型(如切片,映射類型,和函數),但是在比較介面值或者包含了介面值的彙總類型時,我們必須要意識到潛在的panic。同樣的風險也存在於使用介面作為map的鍵或者switch的運算元。
    • 注意:一個包含nil指標的介面不是nil介面(空介面),此時調用介面方法會發生panic錯誤。即一個介面值的動態類型type != nil,但動態值value == nil,此時的介面值 w != nil。(當把一個值為nil的非介面類型的變數轉換為介面類型時,即出現這種情況)
    • 技巧:使用介面時,直接聲明一個介面類型的變數,然後再對它賦值,之後使用該變數時,就可以直接把它和nil比較來判斷是否為空白介面
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.