Go的接口總結
1、什麼是接口安全
- 接口類型是一種抽象的類型,它描述了一系列方法的集合。
- 接口約定:接口類型中定義的方法即爲約定,若一個具體類型實現了全部這些方法,則該類型就知足該接口的約定,或者說它是這個接口類型的實例(實現了該接口)。
- 可替換性(LSP里氏替換):知足相同接口約定的類型之間可進行相互替換。例如:若一個方法的形參定義爲接口類型,那麼它能夠接收任何知足該接口約定的類型的實參。
- 接口內嵌:接口類型可經過組合已有的接口來定義
- io.Writer接口提供了全部的類型寫入bytes的抽象,包括文件類型,內存緩衝區,網絡連接,HTTP客戶端,壓縮工具,哈希等等;io.Reader能夠表明任意能夠讀取bytes的類型,io.Closer能夠是任意能夠關閉的值,例如一個文件或是網絡連接。還有fmt.Stringer接口等
- 接口類型名通常以「er」結尾
2、什麼是接口值網絡
- 接口值:即接口變量的值,由兩個部分組成,一個具體的類型和那個類型的值。它們被稱爲接口的動態類型和動態值
- 接口值的零值:動態類型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比較來判斷是否爲空接口
歡迎關注本站公眾號,獲取更多信息